ВАРИАНТ 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)