Jeg studerer i øjeblikket penetration testing og Python-programmering. Jeg vil bare gerne vide, hvordan jeg kan udføre en Linux-kommando i Python. De kommandoer, jeg ønsker at udføre, er:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Hvis jeg bare bruger print
i Python og kører det i terminalen, vil det gøre det samme som at udføre det, som hvis du skrev det selv og trykkede Enter?
Du kan bruge os.system()
, som her:
import os
os.system('ls')
Eller i dit tilfælde:
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')
Bedre endnu, du kan bruge subprocess's call, det er mere sikkert, mere kraftfuldt og sandsynligvis hurtigere:
from subprocess import call
call('echo "I like potatos"', shell=True)
Eller, uden at påkalde shell:
call(['echo', 'I like potatos'])
Hvis du ønsker at opsamle output, kan du gøre det på følgende måde:
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))
Jeg anbefaler højest* at sætte en timeout
i communicate
, og også at fange de undtagelser du kan få når du kalder den. Dette er en meget fejlbehæftet kode, så du bør forvente, at der vil ske fejl, og håndtere dem i overensstemmelse hermed.
Den første kommando skriver blot til en fil. Du ville ikke udføre den som en shell-kommando, fordi python
kan læse og skrive til filer uden hjælp fra en shell:
with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
f.write("1")
Kommandoen iptables
er noget, du måske vil udføre eksternt. Den bedste måde at gøre dette på er at bruge subprocess module.
import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
'PREROUTING', '-p', 'tcp',
'--destination-port', '80',
'-j', 'REDIRECT', '--to-port', '8080'])
Bemærk, at denne metode heller ikke bruger en shell, hvilket er unødvendigt overhead.
Den hurtigste måde:
import os
os.system("your command here")
Dette er ikke den mest fleksible fremgangsmåde; hvis du har brug for mere kontrol over din proces end "kør den én gang, til den er færdig, og blokér indtil den afsluttes", så bør du bruge subprocess
-modulet i stedet.