2011-08-23 6 views
7

estoy corriendo tcpdump en un subproceso de esta manera:la salida estándar de un subproceso tcpdump después de terminar su

pcap_process = subprocess.Popen(['tcpdump', '-s 0', '-w -', 'tcp'], 
            stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

El argumento -w - es importante: se dice tcpdump para imprimir el archivo resultante a .pcap stdout.

Luego, voy a acceder a un sitio web usando urllib.open(). Una vez hecho esto, me gustaría matar tcpdump y poner lo que imprime en una cadena. He intentado lo siguiente:

pcap_process.terminate() 
result = pcap_process.stdout.read() # or readline(), etc. 

Pero (a menos que esté haciendo algo mal), eso no funciona; Maté el proceso, ahora ya no queda nada por leer. Si utilizo read() o communicate() antes de finalizar, mi script simplemente se quedará allí y seguirá y seguirá, esperando a que termine el tcpdump (que no será).

¿Hay alguna manera de hacerlo (preferiblemente sin bucles)?

+1

Es necesario pasar cada uno de los parámetros a 'tcpdump' por separado:' Popen ([ 'tcpdump', '-s', '0', '-w', '-', 'tcp'], ...) '. El único argumento '-w -' no se interpreta igual que los dos argumentos' -w' y '-', etc. –

+0

Cierto, esa hubiera sido la respuesta correcta :) ¡Gracias de todos modos! –

Respuesta

8

En lugar de utilizar tcpdump, a menudo es recomendable utilizar PCAP directly o Scapy.

Si no es una opción, simplemente llame al communicate después de terminate - matar a un proceso no mata los datos en las tuberías a la misma. Sin embargo, no se olvide de separar los argumentos en la creación del subproceso ([,'-w', '-'] en lugar de [... , '-w -', ..]):

pcap_process = subprocess.Popen(['tcpdump', '-s', '0', '-w', '-', 'tcp'], 
            stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
+1

Desafortunadamente, pypcap no es una opción aquí :(... si hago eso, la salida está vacía. Tal vez el problema esté en otro lugar ... ಠ_ಠ –

+1

@sebastian_k ''-w -'' escribe en un archivo llamado' - '.Quieres' '-w-'' o' '-w' '-''. Has actualizado la respuesta. – phihag

+0

Tienes toda la razón, qué error tan tonto. Muchas gracias, phihag! :) –

Cuestiones relacionadas