Мне нужно запустить сервер на удаленном компьютере и получить номер порта, на котором находится процесс сервера. При вызове сервер прослушивает случайный порт и выводит номер порта на stderr.
Я хочу автоматизировать процесс входа на удаленный компьютер, запуска процесса и получения номера порта. Я написал Python-скрипт с именем "invokejob.py
", который живет на удаленной машине, чтобы действовать как оболочка, которая вызывает задание, а затем возвращает номер порта, выглядит так:
import re, subprocess
executable = ... # Name of executable
regex = ... # Regex to extract the port number from the output
p = subprocess.Popen(executable,
bufsize=1, # line buffered
stderr=subprocess.PIPE
)
s = p.stderr.readline()
port = re.match(regex).groups()[0]
print port
Если я вхожу в интерактивном режиме, этот сценарий работает:
$ ssh remotehost.example.com
Last login: Thu Aug 28 17:31:18 2008 from localhost
$ ./invokejob.py
63409
$ exit
logout
Connection to remotehost.example.com closed.
(Примечание: успешный выход из системы, он не завис).
Однако, если я пытаюсь вызвать его из командной строки, он просто зависает:
$ ssh remotehost.example.com invokejob.py
Кто-нибудь знает, почему он зависает во втором случае, и что я могу сделать, чтобы избежать этого?
Обратите внимание, что мне нужно получить выходные данные программы, поэтому я не могу просто использовать флаг ssh "-f" или перенаправить стандартный вывод.