Создайте и поддерживайте несколько сессий ssh ​​в Python - PullRequest
4 голосов
/ 17 февраля 2012

Как только моя программа была запущена, она открывает любое количество сессий ssh ​​(определяется пользователем) и выполняет определенные команды на серверах бесконечно (в режиме true loop) или пока пользователь не закроется. Из соображений эффективности я хочу создать каждый сеанс только один раз, а затем запускать команды до тех пор, пока пользователь не выйдет.

Как я могу сделать это в Python? В другом посте я столкнулся с классным методом, который использовал subprocess для запуска команды и захвата ее STDOUT. Как я могу сначала начать сеанс, а затем запустить зацикленные команды?

Также приветствуются любые ссылки на подобные процессу материалы в Python. Это мое первое приложение на Python.

Ответы [ 4 ]

6 голосов
/ 17 февраля 2012

Игнорируя Python на данный момент, вы можете мультиплексировать ssh сессии, добавив эту

ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
ControlPersist 1h

в ваш ~/.ssh/config файл. После однократного подключения к машине сеанс ssh с этой машиной останется открытым, и последующие команды будут выполняться на этой машине практически мгновенно после этого. Затем вы можете использовать подпроцесс Python для вызова ssh и выполнения команд на этом компьютере по мере необходимости, и сеанс будет повторно использоваться без необходимости делать что-то особенное.

Вы также можете вызвать ssh с флагом -F, указывающим на альтернативный файл конфигурации, если вы не хотите, чтобы сессия мультиплексировала поведение по умолчанию (или вы развертываете для других пользователей, у которых его может не быть) по умолчанию).

4 голосов
/ 17 февраля 2012

ВАРИАНТ 1: Вы можете повторно использовать процесс ssh, перенаправив ввод с помощью ТРУБЫ.

Вот базовый пример:

[(Z) </tmp> ]% touch input_file
[(Z) </tmp> ]% tailf input_file | ssh <remote_host>

Теперь попробуйте записать что-нибудь в файл

[(Z) </tmp> ]% echo "date" >> /tmp/input_file

Вот способ использовать это в Python, используя подпроцессmodule.

import subprocess
SSH_CMD = "cat -| /usr/bin/ssh -o PasswordAuthentication=no -T -x %s "
HOSTNAME = "127.0.0.1"
s = subprocess.Popen(SSH_CMD%HOSTNAME , shell=True, close_fds=True, 
stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE)

Запускает подпроцесс, который можно использовать повторно.Обратите внимание, что close_fds=True требуется из-за известной ошибки (строка http://bugs.python.org/issue2320).

>>> REMOTE_CMD = "date"
>>> s.stdin.write( REMOTE_CMD +
... "\necho 'remote command completed with exit code = '$?\n")
>>> s.stdout.readline()
'Thu Feb 16 20:01:36 PST 2012\n'
>>> s.stdout.readline()
'remote command completed with exit code = 0\n'

echo 'remote command completed with exit code = '$?\n используется, чтобы узнать, что удаленная команда завершила и что она записывает в s.stdout. Также полезно знать код завершения удаленной команды.

Чтобы использовать тот же подпроцесс для выполнения другой удаленной команды:

>>> REMOTE_CMD = "uptime"
>>> s.stdin.write( REMOTE_CMD +
... "\necho 'remote command completed with exit code = '$?\n")
>>> s.stdout.readline()
' 20:02:17 up 28 days,  9:15, 48 users,  load average: 0.01, 0.02, 0.05\n'
>>> s.stdout.readline()
'remote command completed with exit code = 0\n'

Возвращаясь к вашему вопросу, как только высоздайте подпроцесс ssh, вы можете продолжать отправлять удаленные команды. Как только пользователь завершит работу, вы можете уничтожить подпроцесс.

>>> s.kill()

ВАРИАНТ 2: Я никогда не использовал это, но ssh имеет опцию ControlMasterповторное использование ssh. Проверьте справочную страницу для ssh_config (5)

0 голосов
/ 21 мая 2012

Попробуйте использовать модуль pexpect. Это позволяет открывать и поддерживать сеансы SSH, которые вы можете использовать для отправки в нескольких командах. Вы можете отправлять любые команды и ожидать конкретных выводов, на основании которых вы можете выполнять другие логические операции.

0 голосов
/ 17 февраля 2012

Пробовал смешивать это с многопоточностью?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...