Python pexpect:从ssh隧道上运行的命令中检索日志

Python pexpect:从ssh隧道上运行的命令中检索日志,python,linux,expect,pexpect,Python,Linux,Expect,Pexpect,我正在尝试使用pexpect库编写python脚本 我想做的事情如下: ID = 'User1' cmdrun = 'A LINUX COMMAND' sshChild = pexpect.spawn('ssh root@192.168.0.1') sshOut = file('sshLog.txt','w') sshChild.logfile = sshOut sshChild.expect('Last login:*') sshChild.expect('Please enter your

我正在尝试使用pexpect库编写python脚本

我想做的事情如下:

ID = 'User1'
cmdrun = 'A LINUX COMMAND'
sshChild = pexpect.spawn('ssh root@192.168.0.1')
sshOut = file('sshLog.txt','w')
sshChild.logfile = sshOut
sshChild.expect('Last login:*')
sshChild.expect('Please enter your login Id')
sshChild.sendline(ID + '\r')
sshChild.sendline('ssh 192.168.21.1\r')
sshChild.expect('Last login:*')
sshChild.expect('Please enter your login Id')
sshChild.sendline(ID + '\r')
sshChild.sendline(cmdrun + '\r')
在最后一行之前,一切都按预期进行,我在该行执行cmdrun的发送行。这个命令是一个定制的tcpdump命令,我希望该命令无限期运行,直到我执行sendctrl('C')终止它,然后退出ssh隧道

但是,除非在发送行(cmdrun+'\r')之后放置interact(),否则不会打印tcpdump的输出


无论如何,我可以做这件事而不需要交互,因为我不需要交互终端控制。我想要的是能够等待一段时间,捕获tcpdump输出,然后将tcpdump与ssh隧道一起杀死。

我从未将pexpect用于长时间运行的命令。但您可以尝试以下方法:

Pexpect等待命令完成并提供输出

sshChild.sendline(cmdrun + '\r')
由于这是一个长时间运行的命令,除非您运行它,否则它永远不会给您输出

child.interact()
您是否可以在执行具有适当超时的命令后尝试执行此命令,以便在特定时间后终止长时间运行的命令,并捕获在此之前获得的输出

sshChild.sendline(cmdrun + '\r')
child.expect(pexpect.EOF, timeout=20)
print child.before, child.after

当我对pexpect.TIMEOUT进行修改时,出现以下错误:在read_nonblocking()中超过超时。您知道这意味着什么吗?而且,它只打印出命令输出的前几行。输出是否有某种缓冲区限制,或者我需要指定要捕获多少输出?@paultop6:这就是我的想法。您需要捕获异常,然后打印输出。发生异常是因为超过了超时时间。你可以设定任何你想要的长时间。