Trenutno študiram penetracijsko testiranje in programiranje v Pythonu. Zanima me le, kako naj izvedem ukaz za Linux v Pythonu. Ukazi, ki jih želim izvesti, so:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Če samo uporabim print
v Pythonu in ga zaženem v terminalu, ali se bo izvršil enako, kot če bi ga sam napisal in pritisnil Enter?
Uporabite lahko os.system()
, kot sledi:
import os
os.system('ls')
Ali v vašem primeru:
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')
Še bolje pa je uporabiti klic podprocesa, saj je varnejši, zmogljivejši in verjetno hitrejši:
from subprocess import call
call('echo "I like potatos"', shell=True)
Ali pa brez klica lupine:
call(['echo', 'I like potatos'])
Če želite zajeti izhodni signal, lahko to storite na naslednji način:
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))
Zelo priporočam, da nastavite timeout
v communicate
in da zajamete tudi izjeme, ki jih lahko dobite, ko ga kličete. To je koda, ki je zelo nagnjena k napakam, zato morate pričakovati napake in jih ustrezno obravnavati.
Prvi ukaz preprosto zapiše v datoteko. Tega ukaza ne bi izvedli kot ukaz lupine, saj lahko python
bere in piše v datoteke brez pomoči lupine:
with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
f.write("1")
Ukaz iptables
je nekaj, kar boste morda želeli izvesti navzven. Najboljši način za to je uporaba modula podproces.
import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
'PREROUTING', '-p', 'tcp',
'--destination-port', '80',
'-j', 'REDIRECT', '--to-port', '8080'])
Upoštevajte, da ta način tudi ne uporablja lupine, kar je nepotreben režijski strošek.
Najhitrejši način:
import os
os.system("your command here")
To ni najbolj prilagodljiv pristop; če potrebujete več nadzora nad procesom kot "enkrat ga zaženite do konca in blokirajte, dokler se ne konča", potem raje uporabite modul subproces
.