我试图使用pexpect库编写python脚本。

我试图做的事情如下:

ID = 'User1'
cmdrun = 'A LINUX COMMAND'
sshChild = pexpect.spawn('ssh [email protected]')
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的sendline。该命令是一个自定义的tcpdump命令,我希望该命令无限期运行,直到我执行sendctrl('C')杀死它,然后转义ssh隧道。

但是,除非我在sendline(cmdrun +'\r')之后放置一个interact(),否则不会输出tcpdump的输出。

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

最佳答案

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

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

sshChild.sendline(cmdrun + '\r')

由于这是长时间运行的命令,因此除非您运行,否则它永远不会提供输出
child.interact()

您可以在执行具有适当超时的命令后尝试使用此命令,以便在一定时间后终止长时间运行的命令并捕获到那时为止获得的输出。
sshChild.sendline(cmdrun + '\r')
child.expect(pexpect.EOF, timeout=20)
print child.before, child.after

关于python - pexpect : Retrieve log from command run over ssh tunnel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12425627/

10-13 08:01