Поддерживать соединение S SH в активном состоянии для последующей команды s sh с использованием подпроцесса Python - PullRequest
1 голос
/ 21 июня 2020

Мне нужно регулярно делать запросы к удаленному компьютеру в моей программе python, выполняя команды оболочки. Это нормально с использованием subprocess.run(["ssh", "MY_SERVER", ....]), однако мне нужно получить доступ к серверу, выполнив несколько ProxyJump, что очень замедляет начальное установление соединения.

Можно ли сначала создать постоянное соединение с сервером, а затем запустить оболочку команды и захватить стандартный вывод через этот канал?

1 Ответ

3 голосов
/ 21 июня 2020

Есть несколько способов сделать это.

  • Оставить процесс открытым. Используйте Popen, чтобы открыть процесс s sh и определить его стандартный ввод и вывод как каналы. Затем вы можете писать в его стандартный ввод и читать из его стандартного вывода. Поскольку вы хотите сделать это несколько раз, вам следует не использовать communicate, а писать напрямую в stdin процесса, используя write и flush. (см. фрагмент того же кода ниже)
  • На мой взгляд, лучшим решением было бы использовать пакет Python s sh, например https://github.com/paramiko/paramiko/ (или fabri c - обычно используется для других целей). Здесь вы можете открыть канал и просто записывать в него и читать с меньшими усилиями.

Пример кода для чтения / записи в подпроцесс

import subprocess

p = subprocess.Popen("bash", stdin=subprocess.PIPE, stdout = subprocess.PIPE, stderr=subprocess.PIPE)

p.stdin.write(b"ls\n")
p.stdin.flush()

res = p.stdout.read(100)
print(res)
...