1

リモートコンピューターにsshし、名前付きパイプにコマンドを発行するPythonを使用して、ムービーコントローラー(一時停止/停止...)を作成しています

echo -n q > ~/pipes/pipename

ターミナル経由で ssh して自分で実行すると、これが機能することがわかっているので、名前付きパイプのリダイレクトの設定に問題はありません。私の問題は、ssh セッションのセットアップに時間がかかる (1 ~ 3 秒) ことですが、一時停止コマンドを瞬時に実行したいのです。したがって、次のように永続的なパイプを設定することを考えました。

controller = subprocess.Popen ( "ssh -T -x <hostname>", shell = True, close_fds = True, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE )

次に、次のようにコマンドを発行します

controller.stdin.write ( 'echo -n q > ~/pipes/pipename' )

ssh問題はインタラクティブであるため、キャリッジリターンが必要だと思います。この質問をしたほぼすべての人が既存のモジュールを使用するように言われているため、これが私の問題の始まりです。

それは結構ですが、私はとても近いです。キャリッジ リターンを含める方法を知る必要があるだけです。それ以外の場合は、これらの他のすべてのモジュールを学習する必要があります/etc/hosts。 ssh キーレス認証)。

4

2 に答える 2

1

設定どおりに機能しない理由はわかりませんが、これを試してみます。私がすることは、Popen呼び出しを次のように変更することだと思います:

controller = subprocess.Popen("ssh -T -x <hostname> \"sh -c 'cat > ~/pipes/pipename'\"", ...

そして、単にcontroller.stdin.write('q').

于 2013-11-06T22:18:15.667 に答える
1

コマンドに改行を追加するには、文字列に改行を追加する必要があります。

controller.stdin.write('\n')

パイプをフラッシュする必要がある場合もあります。

controller.stdin.flush()

もちろん、コントローラーは新しいデータを受信する準備ができている必要があります。そうしないと、コントローラーにデータを送信しようとして永久にブロックすることができます。(そして、準備ができていない理由が、標準出力からの読み取りを永久にブロックしていることが原因である場合、これは一部のプラットフォームで発生する可能性があり、回復不能なデッドロックになります。)

于 2013-11-06T22:21:10.660 に答える