0

我正在使用 pexpect ssh 编写脚本进行编译,ssh 自动化看起来像这样,

enter code here
child = ssh_expect('root', server2, cmd)
child.expect(pexpect.EOF)
print child.before

cmd 是这样的:

cmd = "./configure CFLAGS=\"-g -O0 -DDEBUG\""

问题是它说,

configure: error: unrecognized option: -O0

然而,如果使用 commands.getoutput 运行相同的命令,那么它会正确执行。

质疑产生这种错误的问题是什么,我该如何消除这个错误?

提前致谢 :)

4

1 回答 1

0

如果您这样做,它起作用的原因commands.getoutput是所有命令都通过 shell 运行,shell 将解析您的命令行并理解 CFLAGS 之后双引号之间的内容是同一参数的一部分。

当您通过 pexpect 运行 cmds 时,不涉及任何 shell。此外,当您在 ssh 命令行上提供命令时,ssh 连接的另一端不涉及 shell,因此没有任何东西可以将 CFLAGS 解析为一个参数。因此,配置脚本不会得到一个参数(CFLAGS=\"-g -O0 -DDEBUG\"),而是得到三个参数('CFLAGS=-g'、'-O0'、'-DDEBUG')。

如果可能,请避免发送参数以空格分隔的命令。看来 pexpect 可以取而代之的是一个参数列表。工作代码示例:

#/usr/bin/env python

import pexpect

def ssh_expect(user, hostname, cmd):
    child = pexpect.spawn("ssh", ["%s@%s" % (user, hostname)] + cmd, timeout=3600)

    return child

child = ssh_expect("root", "server.example.com", ["./configure", "CFLAGS=\"-g -O0 -DDEBUG\""])
child.expect(pexpect.EOF)
print child.before
于 2011-07-24T10:37:46.970 回答