pexpect ssh无法处理命令选项

时间:2011-07-24 09:23:36

标签: python pexpect

使用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运行相同的命令,那么它会正确执行。

质疑这种错误产生的问题是什么?如何根除这一错误?

提前感谢:)

1 个答案:

答案 0 :(得分:0)

如果你正在执行commands.getoutput它的工作原因是它的所有命令都是通过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