【问题标题】:pexpect: Retrieve log from command run over ssh tunnelpexpect:从通过 ssh 隧道运行的命令检索日志
【发布时间】:2012-09-14 13:31:21
【问题描述】:

我正在尝试使用 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 隧道一起杀死。

【问题讨论】:

    标签: python linux expect pexpect


    【解决方案1】:

    我从未将 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:这就是这里的想法。您需要捕获异常,然后打印输出。发生异常是因为已超过超时。你可以设置任何你想要的长时间。
    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2020-06-17
    • 2020-05-16
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多