În prezent studiez penetration testing și programare Python. Vreau să știu cum aș putea să execut o comandă Linux în Python. Comenzile pe care vreau să le execut sunt:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Dacă folosesc doar print
în Python și o execut în terminal, va face același lucru ca și cum ar fi executat-o ca și cum ai fi tastat-o tu însuți și ai fi apăsat Enter?
Puteți folosi os.system()
, astfel:
import os
os.system('ls')
Sau, în cazul tău:
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')
Mai bine, puteți folosi apelul subprocesului, este mai sigur, mai puternic și probabil mai rapid:
from subprocess import call
call('echo "I like potatos"', shell=True)
Sau, fără a invoca shell-ul:
call(['echo', 'I like potatos'])
Dacă doriți să capturați ieșirea, o modalitate de a face acest lucru este următoarea:
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))
Vă recomand în mod deosebit să setați un timeout
în communicate
și, de asemenea, să capturați excepțiile pe care le puteți obține atunci când îl apelați. Acesta este un cod foarte predispus la erori, așa că ar trebui să vă așteptați să apară erori și să le gestionați în consecință.
Prima comandă scrie pur și simplu într-un fișier. Nu ați executa-o ca o comandă shell, deoarece python
poate citi și scrie în fișiere fără ajutorul unui shell:
with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
f.write("1")
Comanda iptables
este ceva ce ați putea dori să executați din exterior. Cel mai bun mod de a face acest lucru este să folosiți modulul subprocess.
import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
'PREROUTING', '-p', 'tcp',
'--destination-port', '80',
'-j', 'REDIRECT', '--to-port', '8080'])
Rețineți că nici această metodă nu folosește un shell, ceea ce reprezintă un consum inutil.
Cea mai rapidă cale:
import os
os.system("your command here")
Aceasta nu este cea mai flexibilă abordare; dacă aveți nevoie de mai mult control asupra procesului decât "rulează o singură dată, până la finalizare și blochează până când iese", atunci ar trebui să folosiți în schimb modulul subprocess
.