2013-03-09 58 views
4

我有一个pexpect工作,但我在打印输出时遇到问题。在我的测试脚本下面,它创建了ssh连接,然后发送一个sudo su - ,然后发送我的密码,然后发送一个需要sudo访问权限的行(我也添加了几次p.interact()确保它在根目录下)。我遇到的问题是返回我运行的命令的输出。最后,我想运行一些顶级命令,以及一些du -h和其他(更复杂的)空间命令。但是,目前,当它试图打印p.before,我得到:从pexpect sendline读取输出

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 [email protected]') 
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/

任何帮助,非常感谢。

编辑:正如Armin Rigo指出的那样。我正在调用p.before作为像p.before()这样的函数。愚蠢的错误,因为这解释了为什么我今天得到这个错误,而不是昨天当我尝试这个。在对我的脚本进行更改并修改正在发送的命令后,请打印p.before,并且不返回任何输出。从sendline()命令返回输出的其他方法?

+0

错误消息告诉我们'p.before'是一个字符串属性,而不是调用的方法。 – 2013-03-09 23:44:27

回答

1

使用日志文件,该日志文件是存放在terminal.use所有输出示例代码: -

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

打开日志文件,看到一切都在终端事件

-1

要sendline后获取完整的输出使用child.read()

eg

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 
+0

它挂在这条线上 – 2016-08-31 13:41:12