чтение вывода из pexpect sendline

У меня pexpect работает, но у меня проблемы с печатью вывода. В моем тестовом сценарии ниже он создает ssh-соединение, а затем отправляет sudo su -, затем мой пароль, а затем отправляет строку, для которой требуется доступ sudo (я также несколько раз добавлял p.interact() в убедитесь, что он находится в корне). Проблема, с которой я сталкиваюсь, заключается в возврате вывода команд, которые я запускаю. В конце концов, я хочу запустить некоторые команды top, а также некоторые команды du -h и другие (гораздо более сложные) космические команды. Но в настоящее время, когда он пытается напечатать p.before, я получаю:

Traceback (most recent call last):
File "./ssh.py", line 37, in <module>
print p.before()
TypeError: 'str' object is not callable

Вот сценарий, над которым я работаю (отредактировано, чтобы удалить мой пропуск и т. д.)

#!/usr/bin/env python

import pexpect
import struct, fcntl, os, sys, signal

def sigwinch_passthrough (sig, data):
    # Check for buggy platforms (see pexpect.setwinsize()).
    if 'TIOCGWINSZ' in dir(termios):
        TIOCGWINSZ = termios.TIOCGWINSZ
    else:
        TIOCGWINSZ = 1074295912 # assume
    s = struct.pack ("HHHH", 0, 0, 0, 0)
    a = struct.unpack ('HHHH', fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ , s))
    global global_pexpect_instance
    global_pexpect_instance.setwinsize(a[0],a[1])

ssh_newkey = 'Are you sure you want to continue connecting'
p=pexpect.spawn('ssh user@localhost')
i=p.expect([ssh_newkey,'password:',pexpect.EOF,pexpect.TIMEOUT],1)
if i==0:
    print "I say yes"
    p.sendline('yes')
    i=p.expect([ssh_newkey,'password:',pexpect.EOF])
if i==1:
    print "I give password",
    p.sendline("mypassword")
elif i==2:
    print "I either got key or connection timeout"
    pass
elif i==3: #timeout
    pass
global global_pexpect_instance
global_pexpect_instance = p
p.sendline("sudo su -")
p.sendline("mypasswd")
p.sendline("mkdir /home/user/test")
print p.before

Я работаю по этой ссылке: http://linux.byexamples.com/archives/346/python-how-to-access-ssh-with-pexpect/

Любая помощь очень ценится.

РЕДАКТИРОВАТЬ: Как указал Армин Риго ниже. Я вызывал p.before как функцию, подобную p.before(). Глупая ошибка с моей стороны, так как это объясняет, почему я получил эту ошибку сегодня, а не вчера, когда пытался это сделать. После внесения этого изменения в мой сценарий и изменения отправляемой команды напечатайте p.before, и вывод не будет возвращен. Любые другие способы вернуть вывод из команды sendline()?


person cashman04    schedule 09.03.2013    source источник
comment
Сообщение об ошибке сообщает нам, что p.before — это строковый атрибут, а не вызываемый метод.   -  person Armin Rigo    schedule 10.03.2013


Ответы (3)


Используйте файл журнала, этот файл журнала хранит все выходные данные в терминале. Используйте этот пример кода: -

child = pexpect.spawn("ssh user@localhost")
child.logfile = open("/tmp/mylog", "w")
child.expect(".*assword:")
child.send("guest\r")
child.expect(".*\$ ")
child.sendline("python -V\r")

откройте файл журнала и посмотрите все события в терминалах

person Reegan Miranda    schedule 06.04.2013

Чтобы получить полный вывод после отправки, используйте child.read()

e.g.

cmd_resp = pexpect.spawnu(cmd)    # for execution of the command
str_to_search = 'Please Enter The Password'
cmd_resp.sendline('yes')       # for sending the input 'yes'
resp = cmd_resp.expect([str_to_search, 'password:', EOF], timeout=30) # fetch the output status
if resp == 1:
   cmd_resp.sendline(password) 
   resp = cmd_resp.expect([str_to_search, 'outputString:', EOF], timeout=30)
   print(cmd_resp.read()) # to fetch the complete output log
person IRSHAD    schedule 03.08.2016
comment
Он висит на этой строке - person iDebD_gh; 31.08.2016

p.before - это строка, а не функция. Чтобы увидеть вывод, вы должны написать print p.before. Надеюсь, это может помочь вам

person Dharmendra Mishra    schedule 13.12.2019