2

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

但是在我的机器上运行代码存在问题。我想检查是否有任何活动的、非失效的 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 正在运行,这样我就不会打开另一个

4

1 回答 1

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

关于 fabric.api.run 的文档

有关 fabric.api.envhost_stringpassword的文档

于 2013-10-05T21:39:18.993 回答