我需要在远程机器上启动服务器并检索服务器进程正在使用的端口号。调用时,服务器将侦听随机端口并在 stderr 上输出端口号。
我想自动化登录到远程机器、启动进程和检索端口号的过程。我编写了一个名为“ invokejob.py
”的 Python 脚本,它位于远程机器上,作为调用作业然后返回端口号的包装器,它看起来像这样:
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” 标志或重定向标准输出。