2

我需要在远程机器上启动服务器并检索服务器进程正在使用的端口号。调用时,服务器将侦听随机端口并在 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” 标志或重定向标准输出。

4

2 回答 2

3
s = p.stderr.readline()

我怀疑是上面的行。当您直接通过 ssh 调用命令时,您不会获得完整的 pty(假设是 Linux),因此没有 stderr 可供读取。

当您以交互方式登录时,将为您设置标准输入、标准输出和标准错误,因此您的脚本可以正常工作。

于 2008-08-28T21:53:10.850 回答
0

如果您执行以下操作会怎样:

ssh <remote host> '<your command> ;<your regexp using awk or something>'

例如

ssh <remote host> '<your program>; ps aux | awk \'/root/ {print $2}\''

这将连接到、执行然后打印任何用户 root 或任何在其描述中带有 root 的进程的每个 PSID。

我已经使用这种方法在远程机器上运行各种命令。关键是将要执行的命令括在单引号 (') 中,并用分号 (;) 分隔每个命令。

于 2008-08-28T23:50:19.587 回答