I'm atualmente estudando testes de penetração e programação Python. Eu só quero saber como eu iria executar um comando Linux em Python. Os comandos que eu quero executar são:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Se eu apenas utilizar impressão
em Python e executá-lo no terminal, ele fará o mesmo que executá-lo como se você mesmo estivesse digitando e pressionando Enter?
Você pode utilizar os.system()
, como este:
import os
os.system('ls')
Ou no seu 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')
Melhor ainda, você pode usar o subprocesso's call, é mais seguro, mais poderoso e provavelmente mais rápido:
from subprocess import call
call('echo "I like potatos"', shell=True)
Ou, sem invocar a concha:
call(['echo', 'I like potatos'])
Se você quer capturar a saída, uma maneira de fazer isso é assim:
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))
Eu elevadamente recomendo definir um timeout
em communicar
, e também para capturar as exceções que você pode obter ao chamá-lo. Este é um código muito propenso a erros, portanto você deve esperar que os erros aconteçam e lidar com eles de acordo.
O primeiro comando simplesmente escreve para um arquivo. Você não't executaria isso como um comando shell porque o python
pode ler e escrever em arquivos sem a ajuda de um shell:
with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
f.write("1")
O comando iptables
é algo que você pode querer executar externamente. A melhor maneira de fazer isso é utilizar o módulo de subprocesso.
import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
'PREROUTING', '-p', 'tcp',
'--destination-port', '80',
'-j', 'REDIRECT', '--to-port', '8080'])
Note que este método também não utiliza uma concha, o que é uma sobrecarga desnecessária.
A maneira mais rápida:
import os
os.system("your command here")
Esta é't a abordagem mais flexível; se você precisa de mais controle sobre seu processo do que "execute-o uma vez, até a conclusão, e bloqueie até que ele saia" então você deve utilizar o módulo 'sub-processo' em seu lugar.