Attualmente sto studiando test di penetrazione e programmazione Python. Voglio solo sapere come potrei eseguire un comando Linux in Python. I comandi che voglio eseguire sono:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Se uso semplicemente print
in Python e lo eseguo nel terminale, farà la stessa cosa che eseguirlo come se lo stessi digitando tu stesso e premendo Enter?
Potete usare os.system()
, come questo:
import os
os.system('ls')
O nel tuo 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')
Meglio ancora, puoi usare la chiamata di subprocesso, è più sicura, più potente e probabilmente più veloce:
from subprocess import call
call('echo "I like potatos"', shell=True)
Oppure, senza invocare la shell:
call(['echo', 'I like potatos'])
Se volete catturare l'output, un modo per farlo è come questo:
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))
Raccomando altamente di impostare un timeout
in communicate
, e anche di catturare le eccezioni che puoi ottenere quando lo chiami. Questo è un codice molto soggetto ad errori, quindi dovreste aspettarvi che gli errori accadano e gestirli di conseguenza.
Il primo comando scrive semplicemente su un file. Non lo eseguireste come un comando di shell perché python
può leggere e scrivere su file senza l'aiuto di una shell:
with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
f.write("1")
Il comando iptables
è qualcosa che potreste voler eseguire esternamente. Il modo migliore per farlo è usare il subprocess module.
import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
'PREROUTING', '-p', 'tcp',
'--destination-port', '80',
'-j', 'REDIRECT', '--to-port', '8080'])
Si noti che anche questo metodo non utilizza una shell, che è un inutile sovraccarico.
Il modo più veloce:
import os
os.system("your command here")
Questo non è l'approccio più flessibile; se avete bisogno di un controllo maggiore sul vostro processo rispetto a "eseguirlo una volta, fino al completamento, e bloccarlo finché non esce", allora dovreste usare il modulo subprocess
.