2010-12-03 15 views
14
1 import subprocess 
    2 raw = raw_input("Filename:").lower() 
    3 ip = raw_input("Host:").lower() 
    4 cmd = subprocess.call("tcpdump -c5 -vvv -w" + " raw " + " ip ",shell=True) 

Así que este es mi script. Todo funciona además de un objetivo clave, usando la entrada en bruto. Me permite ingresar todo lo que quiero, pero cuando se trata de guardar el archivo o usar una ip/host doe en realidad no hace nada. Claro que me da los paquetes, pero desde el host local no el host que escribo.Subproceso Variables

cómo sé que esto no funciona es porque mi primera entrada en bruto es el nombre del archivo, así que pongo la prueba, cuando miro en la carpeta donde estaba mi script, produce un archivo llamado "raw", es decir, no está tomando mi entrada solo usando lo que está dentro de mi "X" ...

Así que tengo algunas oportunidades de llegar a esto:

1 import subprocess 
    2 raw = raw_input("Filename:").lower() 
    3 ip = raw_input("Host:").lower() 
    4 cmd = subprocess.call("tcpdump -c5 -vvv -w" + raw + "host" + ip,shell=True) 

que es grande porque lo que realmente requiere la -w pero lo guarda ahora como rawhostip lugar de entrada "en bruto" s. para referencia esto es lo que el comando se ve como en el terminal:

tcpdump -c5 -vvv -w savename host wiki2 

los únicos dos variabls son savename y wiki2 son necesarios el resto de la orden de trabajo.

con este script me sale este error:

import subprocess 
raw = raw_input("Filename:").lower() 
ip = raw_input("Host:").lower() 
cmd = subprocess.call("tcpdump -c5 -vvv -w" + raw, "host" + ip,shell=True) 

error:

Traceback (most recent call last): 
    File "te.py", line 4, in <module> 
    cmd = subprocess.call("tcpdump -c5 -vvv -w" + raw, "host" + ip,shell=True) 
    File "/usr/lib/python2.6/subprocess.py", line 480, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.6/subprocess.py", line 583, in __init__ 
    raise TypeError("bufsize must be an integer") 
TypeError: bufsize must be an integer 

Estoy en una perdida. Cualquier ayuda será genial, sí, lo sé, mire los documentos del subproceso en el sitio: X, necesito un ser humano para enseñarme, no entiendo lo que estoy leyendo.

Mi pregunta es cómo trabajo con estas variables.

+0

¿Cuál es la pregunta? –

Respuesta

27

No utilice shell=True. Eso debería ser False.

Está cometiendo errores sutiles con la entrada. En concreto, si tiene dos cadenas:

>>> s1 = 'Hello' 
>>> s2 = 'Hi' 
>>> s1 + s2 
'HelloHi' 

Aviso, no hay espacio entre Hello y Hi. Entonces no hagas esto (Su línea 4)

Usted debe hacer (el buen sentido):

>>> raw = raw_input('Filename: ') 
Filename: test 
>>> ip = raw_input('Host: ') 
Host: 192.168.1.1 
>>> command = 'tcpdump -c5 -vvv -w {0} {1}'.format(raw, ip) # the command goes here 
>>> subprocess.call(command.split(), shell=False) # call subprocess and pass the command as a list using split 

Ahora debería funcionar.

+2

¡Dios mío, Sukhbir! : D Bueno, aún no lo he probado, pero ahora finalmente entiendo estas {0} {1} cosas puestas en comandos en ejemplos. Son tablas/listas ¿no? sabía que no usar shell = True, es un problema de seguridad. No sabía Falso, no era gracias por mostrarme eso. déjame probarlo brb –

+0

Bien, estoy bastante seguro de que el nombre de archivo está funcionando, pero una cosa que no es correcta en esto es llamar al "host" el comando sin python es: tcpdump -c5 -vvv -w test host 192.168.1.1 estoy usando sus variables en su ejemplo –

+0

Acabo de darle el esquema básico, ¡el resto es para que lo compruebe! ¡Experimentar! – user225312

24

No debe usar el formulario de cadena ob las funciones subprocess. Pruebe:

subprocess.check_call(["tcpdump", "-c5", "-vvv", "-w", raw, "host", ip]) 
+1

+1 punto tomado sobre este enfoque. – user225312