pexpect ssh не может обрабатывать параметры команды - PullRequest
1 голос
/ 24 июля 2011

я использую 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 голосов
/ 24 июля 2011

Причина, по которой это работает, если вы делаете 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
...