reading output from pexpect sendline

28,450

Use logfile, that logfile is store all output in terminal.use that example code:-

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")

open the log file and see everything in terminals event

Share:
28,450
cashman04
Author by

cashman04

Updated on December 14, 2020

Comments

  • cashman04
    cashman04 over 3 years

    I have pexpect working, but I am having problems printing the output back from it. In my test script below, it creates the ssh connection, and then sends a sudo su -, then my password, and then sends a line that would require sudo access to do (I have also added p.interact() a few times to make sure it is at root). The problem I am having, is with returning the output of the commands I run. In the end I am wanting to run some top commands, and some du -h, and other(much more complex) space commands. But currently when it tries to print p.before, I get:

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

    Here is the script I am working from(edited to remove my pass and such)

    #!/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
    

    I am working off of this link: http://linux.byexamples.com/archives/346/python-how-to-access-ssh-with-pexpect/

    Any help is much appreciated.

    EDIT: As Armin Rigo pointed out below. I was calling to p.before as a function like p.before(). Stupid mistake on my part, as this explains why I was getting this error today, and not yesterday when I was trying this. After making that change to my script, and modifying the command being sent, print p.before, and no output is returned. Any other ways to return output from a sendline() command?

  • iDebD_gh
    iDebD_gh over 7 years
    It hangs at this line