2011-01-31 12 views
8

私はSSH上でブロックデバイスをDDにするいくつかのコードに取り組んでおり、サブプロセスでこれを行いたいので、転送中にDDのステータスを監視できますddプロセスをSIGUSR1で実行して現在の状態を取得し、selectを使用してそれを読み取る)。2つのサブプロセス間のPythonパイプ出力

私が実装しようとしているコマンドは、このようなものになるだろう:私が試した現在の方法

dd if=/dev/sda | ssh [email protected] 'dd of=/dev/sda' 

た:

dd_process = subprocess.Popen(['dd','if=/dev/sda'],0,None,None,subprocess.PIPE, subprocess.PIPE) 
ssh_process = subprocess.Popen(['ssh','[email protected]','dd of=/dev/sda'],0,None,dd_process.stdout) 

私はこれを実行したときただし、SSHプロセスになります10〜40秒後に消滅する。
私は完全にここで鈍っているのですか、またはこのようなサブプロセス間をパイプする方法はありませんか?

編集:実際のコードにはホスト名が含まれていません。これは正しいことです。

+1

私はあなたがキーベースの認証やその他の非対話型のメカニズムを使用していることを願っています。 –

+0

明らかに;)私はちょうど関連する例 –

+0

を短縮するためにそのssh引数を取り出しました:[パイプで複数のプロセスを接続するにはどのようにsubprocess.Popenを使用しますか?](http://stackoverflow.com/q/295459/4279) – jfs

答えて

13
from subprocess import Popen, PIPE 
dd_process = Popen(['dd', 'if=/dev/sda'], stdout=PIPE) 
ssh_process = Popen(['ssh', '[email protected]', 'dd','of=/dev/sda'],stdin=dd_process.stdout, stdout=PIPE) 
dd_process.stdout.close() # enable write error in dd if ssh dies 
out, err = ssh_process.communicate() 

これは、最初のプロセス出力を2番目のパイプにパイプする方法です。 (ssh_processのstdinに気付く)

+0

'grep_process' ?! –

+1

これは私がすでに持っていたものですが、それでも動作していません。 ssh:dd of =/dev/sda:名前解決の一時的な失敗 –

+1

@Cristian、sorry - ssh_processでなければなりません。 @Philip - このエラーはドメインとインターネット接続(example.comとして指定したもの)と関係があります。直接達成できますか?それはPythonを使用しないでですか? –

4

sh Pythonライブラリを使用すると、OSコマンドを呼び出してパイプするのが簡単になります。ドキュメントから

for line in tr(tail("-f", "test.log", _piped=True), "[:upper:]", "[:lower:]", _iter=True): 
    print(line) 
+0

'sh'モジュールは本当に素晴らしいです。共有してくれてありがとう。 – mpontillo

+0

しかし、チェックされていない入力で使うのは危険です – LtWorf

関連する問題