1

嗨,我必须执行一个 shell 命令: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()

但是我得到一个错误差异:额外的操作数猫

我对python很陌生。任何帮助,将不胜感激

4

2 回答 2

7

您正在使用<(...)由 shell 解释的(进程替换)语法。提供shell=True给 Popen 以使其使用外壳:

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 shell (/bin/sh),因此请使用可执行参数来确定要使用的 shell。

于 2012-06-12T19:05:00.603 回答
3

您在命令行中使用了一种称为进程替换的特殊语法。大多数现代 shell(bash、zsh)都支持这一点,但 /bin/sh 不支持。因此,内德建议的方法可能行不通。(如果另一个 shell 提供 /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/bash 而不是 /bin/sh (如subprocess docs中所述)。

于 2012-06-12T19:30:01.700 回答