1

こんにちは、シェル コマンド :diff <(ssh -n root@10.22.254.34 cat /vms/cloudburst.qcow2.*) <(ssh -n root@10.22.254.101 cat /vms/cloudburst.qcow2) を実行する必要があります。

cmd="diff <(ssh -n root@10.22.254.34 cat /vms/cloudburst.qcow2.*) <(ssh -n root@10.22.254.101 cat /vms/cloudburst.qcow2)"
args = shlex.split(cmd)
output,error = subprocess.Popen(args,stdout = subprocess.PIPE, stderr= subprocess.PIPE).communicate()

ただし、エラー diff: extra operand cat が表示されます

私はPythonにかなり慣れていません。どんな助けでもいただければ幸いです

4

2 に答える 2

7

<(...)シェルによって解釈される (プロセス置換) 構文を使用しています。shell=TruePopen に提供して、シェルを使用できるようにします。

cmd = "diff <(ssh -n root@10.22.254.34 cat /vms/cloudburst.qcow2.*) <(ssh -n root@10.22.254.101 cat /vms/cloudburst.qcow2)"
output,error = subprocess.Popen(cmd, shell=True, executable="/bin/bash", stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

Bourne シェル (/bin/sh) は必要ないため、executable 引数を使用して、使用するシェルを決定します。

于 2012-06-12T19:05:00.603 に答える
3

コマンドラインでプロセス置換と呼ばれる特別な構文を使用しています。これは最新のシェル (bash、zsh) のほとんどでサポートされていますが、/bin/sh ではサポートされていません。したがって、Ned が提案した方法は機能しない可能性があります。(別のシェルが /bin/sh を提供し、sh の動作を「正しくエミュレート」しない場合は可能ですが、保証されていません)。代わりにこれを試してください:

cmd = "diff <(ssh -n root@10.22.254.34 cat /vms/cloudburst.qcow2.*) <(ssh -n root@10.22.254.101 cat /vms/cloudburst.qcow2)"
output,error = subprocess.Popen(['/bin/bash', '-c', cmd], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

これは基本的に shell=True パラメーターが行うことですが、/bin/sh の代わりに /bin/bash を使用します (サブプロセスのドキュメントで説明されています)。

于 2012-06-12T19:30:01.700 に答える