Udfør shell-kommandoer i Python

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?

Løsning

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.

https://docs.python.org/3/library/subprocess.html

Kommentarer (5)

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.

Kommentarer (0)

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.

Kommentarer (0)