Ejecutar comandos del shell en Python

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?

Solución

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.

https://docs.python.org/3/library/subprocess.html

Comentarios (5)

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.

Comentarios (0)

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.

Comentarios (0)