pexpect确定ssh是否存在:使用ps和grep

时间:2013-10-05 19:15:16

标签: python ssh tunnel pexpect

我正在尝试使用脚本在Ubuntu 13.04 64位上自动执行ssh隧道。它基于Pexpect模块中的ssh_tunnel示例(http://www.noah.org/wiki/pexpect#ssh_tunnel.py

但是在我的机器上运行代码时出现问题。我想检查是否有任何已经运行的活动,非解散的ssh隧道。如果我在终端中检查这个,我会收到ssh-agent和ssh:

    user@comp$ ps -e|grep ssh
     3578 ?        00:00:00 ssh-agent
     9686 pts/0    00:10:31 ssh <defunct>
    10955 pts/0    00:00:02 ssh

所以我尝试使用grep的-v选项(反转选择)过滤结果,我能够获得活动隧道。这将允许我确定是否需要打开新隧道:

    user@comp$ ps -e|grep ssh|grep -v agent|grep -v def
    10995 pts/0    00:00:00 ssh

不幸的是,如果我使用pexpect.spawn调用上面的命令,然后按以下方式执行:

ps = pexpect.spawn ('ps -e|grep ssh | grep -v agent | grep -v def')
res1 = ps.expect (['ssh', pexpect.EOF, pexpect.TIMEOUT])

res1返回1,表示pexpect.EOF(找不到ssh进程)

我在这里做错了什么?否则,是否有另一种方法可以检查是否已经运行了ssh,以便我不会打开另一个

1 个答案:

答案 0 :(得分:0)

我建议使用fabric通过ssh发布命令。

$ pip install fabric

这里,我将在本地计算机(127.0.0.1)上运行该命令作为示例。

from fabric.api import run, env

command = 'ps -e|grep ssh | grep -v agent | grep -v def'
env.host_string = '127.0.0.1'
env.password = 'mypassword'
run(command)
...
[127.0.0.1] out:  4921 ??         0:00.06 /usr/sbin/sshd -i
[127.0.0.1] out:  4924 ??         0:00.01 /usr/sbin/sshd -i
[127.0.0.1] out:  5196 ??         0:00.00 /usr/libexec/launchproxy /usr/sbin/sshd -i
[127.0.0.1] out:  5197 ??         0:00.04 /usr/sbin/sshd -i
[127.0.0.1] out:  5198 ??         0:00.01 /usr/sbin/sshd -i
[127.0.0.1] out:  5199 ??         0:00.03 /usr/sbin/sshd -i
[127.0.0.1] out:  5200 ??         0:00.01 /usr/sbin/sshd -i
[127.0.0.1] out:  5201 ??         0:00.06 /usr/sbin/sshd -i
[127.0.0.1] out:  5204 ??         0:00.00 /usr/sbin/sshd -i
[127.0.0.1] out:  4920 ttys002    0:00.02 ssh smlstvnh@127.0.0.1
[127.0.0.1] out:  5242 ttys004    0:00.00 grep ssh

Documentation on fabric.api.run

Documentation on fabric.api.envhost_stringpassword