2011-01-31 15 views
8

Estoy trabajando en algún código que DD DD un dispositivo de bloque a través de SSH, y estoy queriendo hacer esto con un subproceso para que pueda monitorear el estado de DD durante la transferencia (matando al dd procesa con SIGUSR1 para obtener su estado actual, y lo lee usando selectores).Salida de tubería Python entre dos subprocesos

El comando que estoy tratando de poner en práctica sería algo como esto:

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

El método actual que probé fue:

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) 

Sin embargo cuando funciono esto, el proceso se convierte en SSH difunto después de 10-40 segundos.
¿Estoy siendo completamente obtuso aquí, o no hay forma de canalizar entre subprocesos como este?

Editar: Resulta que mi código real no tenía el nombre de host en él. Esta es la forma correcta de hacer las cosas.

+1

espero que usted está utilizando la autenticación basada en una clave u otro mecanismo no interactivo. –

+0

Obviamente;) Acabo de sacar ese argumento ssh para acortar el ejemplo –

+0

relacionado: [¿Cómo uso el subproceso.Popen para conectar múltiples procesos por tuberías?] (Http://stackoverflow.com/q/295459/4279) – jfs

Respuesta

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

Esta es la forma de TUBER la primera salida de proceso a la segunda. (aviso stdin en el ssh_process)

+0

'grep_process' ?! –

+1

Bueno, eso es lo que ya tenía, y todavía no funciona. El error específicamente cuando ssh va difunto es: ssh: dd of =/dev/sda: Fallo temporal en la resolución de nombre –

+1

@Cristian, lo siento: debe ser ssh_process. @Philip: el error tiene que ver con su dominio y conectividad a Internet (que ha proporcionado como example.com). ¿Puedes lograrlo directamente? Eso es sin usar Python? –

4

La biblioteca de Python sh hace que sea fácil llamar a los comandos del sistema operativo y canalizarlos.

De la documentación:

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

Ese módulo 'sh' es realmente agradable. Gracias por compartir. – mpontillo

+0

Pero es peligroso usarlo con la entrada sin marcar – LtWorf

Cuestiones relacionadas