2016-06-29 14 views
1

サブプロセスモジュールを使用して、sshを介して生成されたプロセスを制御したいとします。検索することによりサブプロセスの出力を抑制する

と私はこれが機能することを見つけテスト:

import subprocess 
import os 
import time 

node = '[email protected]' 
my_cmd = ['sleep','1000'] 
devnull = open(os.devnull, 'wb') 
cmd = ['ssh', '-t', '-t', node] + my_cmd 
p = subprocess.Popen(cmd, stderr=devnull, stdout=devnull) 


while True: 
    time.sleep(1) 
    print 'Normal output' 

私が提供-t -tオプションは私だけではなく、sshコマンドのリモートプロセスを終了させることができます。しかしこれは、改行がもはや効果的でなく、文字列を読みにくいようにするので、私のプログラムの出力をスクランブルします。

sshをpythonプログラムのフォーマットに影響させないようにするにはどうすればよいですか?

出力例:

guest:~$ python2 test.py 
Normal output 
      Normal output 
          Normal output 
             Normal output 
                Normal output 
                   Normal output 
                       Normal output 
(First ctrl-c) 
Normal output 
Normal output 
Normal output 
(Second ctrl-c) 
^CTraceback (most recent call last): 
    File "test.py", line 13, in <module> 
    time.sleep(1) 
KeyboardInterrupt 
+1

サンプル出力を提供できますか?それが "スクランブリング"を意味するかどうかは不明です。 – SuperBiasedMan

+0

stackoverflowはすべてを揃えます。ラインを変更した後、出力はターミナルの開始にアライメントされません。メッセージは正しく印刷されています。 –

+0

もし私がctrl-cして私の端末に戻ってきたら、Enterを押すと、コマンドラインは新しい行ではなく、前の行の隣に表示されます。 sshの-t -tオプションと何か –

答えて

2

[OK]を、出力は現在明らかです。なぜ私は正確にはわからないが、コマンドssh -t -tはローカル端末をrawモードにする。とにかく、リモコンでcursesプログラム(viなど)を直接使用できるようにするためのもので、その場合は変換を行わないでください。簡単な新機能のある\n - >\r\n最初の列にカーソルを置きます。しかし、私はsshのドキュメントでこれについてのリファレンスを見つけることができませんでした。

rawモードではなく、地元のttyドライバによって処理されるのでリモートに送信するはCtrl + Cせので(-t -t)を使用すると、リモートプロセスを強制終了することができます。

IMHO、あなただけのリモートにはCtrl + Cを渡すためにPTYの割り当ての副作用を使用しているので、これは、設計匂いであり、あなたは、ローカルシステム上のrawモードで他の副作用のために苦しみます。ローカルキーボードで特殊文字を入力するときは標準入力(stdinput = subprocess.PIPE)を処理し、chr(3)を明示的に送信するか、それを行うSIG-INT用のシグナルハンドラをインストールする必要があります。

また、回避策として、ローカルコマンドを受け入れ可能なモードでリセットするためにリモートコマンドを開始した後に、os.system("stty opost -igncr")(またはそのサブプロセスと同等以上のもの)のようなものをそのまま使用することもできます。

+0

あなたの答えをありがとう。 ctrl-cはサブプロセスモジュール(p.kill()またはp.terminate())を使用してプロセスを強制終了または終了するので、サブプロセスへのシグナルの転送は気にしません。 stdin = subprocess.PIPEはトリックを行いました。 –

+0

リモートシステムにttyを割り当てていない場合、Ctrl-Cを送信しても特別な効果はありません。 ttyドライバは文字をINTR信号に変換します。 – Kenster

関連する問題