Actualmente estoy estudiando pruebas de penetración y programación en Python. Quiero saber cómo haría para ejecutar un comando de Linux en Python. Los comandos que quiero ejecutar son:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Si simplemente uso print
en Python y lo ejecuto en la terminal, ¿hará lo mismo que ejecutarlo como si lo escribiera uno mismo y pulsara Enter?
Puedes usar os.system()
, así:
import os
os.system('ls')
O en tu caso:
os.system('echo 1 > /proc/sys/net/ipv4/ip_forward')
os.system('iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080')
Mejor aún, puedes usar la llamada del subproceso, es más segura, más potente y probablemente más rápida:
from subprocess import call
call('echo "I like potatos"', shell=True)
O bien, sin invocar el shell:
call(['echo', 'I like potatos'])
Si quieres capturar la salida, una forma de hacerlo es así
import subprocess
cmd = ['echo', 'I like potatos']
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
o, e = proc.communicate()
print('Output: ' + o.decode('ascii'))
print('Error: ' + e.decode('ascii'))
print('code: ' + str(proc.returncode))
Recomiendo altamente establecer un timeout
en communicate
, y también capturar las excepciones que puedas obtener al llamarlo. Este es un código muy propenso a errores, por lo que debes esperar que estos ocurran y manejarlos en consecuencia.
El primer comando simplemente escribe en un archivo. Usted no ejecutaría eso como un comando de la shell porque python
puede leer y escribir en archivos sin la ayuda de una shell:
with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
f.write("1")
El comando iptables
es algo que puede querer ejecutar externamente. La mejor manera de hacerlo es utilizar el módulo de subproceso.
import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
'PREROUTING', '-p', 'tcp',
'--destination-port', '80',
'-j', 'REDIRECT', '--to-port', '8080'])
Tenga en cuenta que este método tampoco utiliza un shell, lo que supone una sobrecarga innecesaria.
La forma más rápida:
import os
os.system("your command here")
Este no es el enfoque más flexible; si necesita más control sobre su proceso que "ejecutarlo una vez, hasta su finalización, y bloquearlo hasta que salga", entonces debería usar el módulo "subproceso" en su lugar.