pexpect определить, существует ли ssh: используя ps и grep

Я пытаюсь сделать скрипт для автоматизации туннелирования ssh на Ubuntu 13.04 64 бит. Он основан на примере ssh_tunnel из модуля Pexpect (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

Поэтому я попытался отфильтровать результаты, используя опцию -v (инвертировать выбор) grep, я могу получить активные туннели. Это позволит мне определить, нужно ли мне открывать новый туннель:

    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, чтобы я не открывал другой


person tdk    schedule 05.10.2013    source источник


Ответы (1)


Я бы рекомендовал использовать 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 [email protected]
[127.0.0.1] out:  5242 ttys004    0:00.00 grep ssh

Документация по Fabric.api.run

Документация по fabric.api.env, host_string и пароль

person samstav    schedule 05.10.2013
comment
Я также хотел бы, чтобы tp автоматизировал задачу держать его открытым (т. Е. Я хотел бы, чтобы пароль вводился автоматически при повторном подключении. Можете ли вы сказать мне, можно ли это сделать с помощью Fabric? - person tdk; 06.10.2013
comment
Определенно. Вы также можете использовать ключи ssh. Ответ обновлен, чтобы определить env.password - person samstav; 06.10.2013