Python ejecuta un comando de shell complejo

Hola, tengo que ejecutar un comando de shell :diff <(ssh -n root@10.22.254.34 cat /vms/cloudburst.qcow2.*) <(ssh -n root@10.22.254.101 cat /vms/cloudburst.qcow2) Lo intenté

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()

Sin embargo, recibo un error de diferencia: gato de operando adicional

Soy bastante nuevo en Python. Cualquier ayuda sería apreciada

preguntado el 12 de junio de 12 a las 19:06

Está pasando los parámetros "<(ssh", "-n", "root@...", "cat" literalmente a la herramienta diff. Al escribir en un shell, las partes "<(...)" se vuelven se evalúa primero, y el (archivo) resultante se pasa al comando diff como parámetro en su lugar. ¿Qué shell está usando? -

2 Respuestas

Está utilizando <(...) (sustitución de proceso), que es interpretada por el shell. Proveer shell=True a Popen para que use un shell:

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()

Dado que no desea el shell Bourne (/bin/sh), utilice el argumento ejecutable para determinar el shell que se utilizará.

Respondido el 12 de junio de 12 a las 20:06

Intenté eso, sin embargo, recibo un error '/ bin/sh: Error de sintaxis: "(" inesperado'. - neorg

Está utilizando una sintaxis especial llamada sustitución de procesos en su línea de comando. Esto es compatible con la mayoría de los shells modernos (bash, zsh), pero no con /bin/sh. Por lo tanto, el método sugerido por Ned podría no funcionar. (Podría, si otro shell proporciona /bin/sh y no "emula correctamente" el comportamiento de sh, pero no está garantizado). prueba esto en su lugar:

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()

Esto es básicamente lo que hace el parámetro shell=True, pero con /bin/bash en lugar de /bin/sh (como se describe en el documentos de subproceso).

Respondido el 12 de junio de 12 a las 20:06

¡Perfecto! sencillo, efectivo - Jacob Vlijm

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.