Причина, по которой это работает, если вы делаете commands.getoutput
, заключается в том, что все команды там выполняются через оболочку, которая будет анализировать вашу командную строку и понимать, что то, что находится между двойными кавычками после CFLAGS, является частью того же параметра.
Когда вы запускаете cmds через pexpect, оболочка не используется.Кроме того, на другой стороне соединения ssh не задействована оболочка, когда вы предоставляете команды в командной строке ssh, поэтому нет ничего, что разбирает 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