使用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运行相同的命令,那么它会正确执行。
质疑这种错误产生的问题是什么?如何根除这一错误?
提前感谢:)
答案 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