2

リモート マシンでサーバーを起動し、サーバー プロセスが接続しているポート番号を取得する必要があります。呼び出されると、サーバーはランダムなポートでリッスンし、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

2番目のケースでハングする理由と、これを回避するために何ができるかを知っている人はいますか?

プログラムの出力を取得する必要があることに注意してください。そのため、ssh の「-f」フラグを使用したり、標準出力をリダイレクトしたりすることはできません。

4

2 に答える 2

3
s = p.stderr.readline()

上の行だと思います。ssh を介して直接コマンドを呼び出すと、完全な pty (Linux を想定) が得られないため、stderr から読み取ることができません。

対話的にログインすると、stdin、stdout、および 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 に答える