3

我正在尝试使用 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 执行 sendline。此命令是自定义 tcpdump 命令,我希望该命令无限期运行,直到我执行 sendctrl('C') 来杀死它,然后逃离 ssh 隧道。

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

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

4

1 回答 1

1

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

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

sshChild.sendline(cmdrun + '\r')

由于这是长时间运行的命令,除非您运行,否则它永远不会给您输出

child.interact()

您是否可以在以适当的超时时间执行命令后尝试这样做,以便在一定时间后终止长时间运行的命令并捕获直到那时获得的输出。

sshChild.sendline(cmdrun + '\r')
child.expect(pexpect.EOF, timeout=20)
print child.before, child.after
于 2012-09-14T16:40:16.100 回答