Jeg studerer for øyeblikket penetrasjonstesting og Python-programmering. Jeg vil bare vite hvordan jeg vil gå ut på å utføre en Linux-kommando i Python. Kommandoene jeg vil utfø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 bruker print i Python og kjøre den i terminalen, vil den gjøre det samme som å utføre den som om du skrev den selv og trykket  Enter ? 
Kommentarer
Svar
 Du kan bruke os.system(), slik: 
import os os.system("ls") Eller i ditt tilfelle:
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") Enda bedre, du kan bruke underprosessens samtale, det er tryggere, kraftigere og sannsynligvis raskere:
from subprocess import call call("echo "I like potatos"", shell=True) Eller uten å påberope skallet:
call(["echo", "I like potatos"]) Hvis du vil fange utdataene, er en måte å gjøre det på denne måten:
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  på det sterkeste å sette timeout i communicate, og også for å fange unntakene du kan få når du ringer til det. Dette er en veldig feilutsatt kode, så du kan forvente at feil skal skje og håndtere dem deretter. 
https://docs.python.org/3/library/subprocess.html
Kommentarer
- os.system er utfaset siden versjon 2.6. Den rette modulen er å bruke underprosess.
-  @binarysubstrate, utfaset som ikke støttet eller ikke tilgjengelig? Jeg ‘ har nylig jobbet på maskin med 2.7 (ikke etter valg), og os.systemfungerer fremdeles.
-  Hvis du bruker subprocess.callsom anbefalt, må du kanskje spesifisereshell=True… se her
- Med Python 3.4 skal shell = True oppgis ellers vil ikke ringekommandoen fungere. Som standard vil samtale prøve å åpne en fil spesifisert av strengen med mindre shell = True er satt. Det ser også ut som at i Python 3.5 kall erstattes med kjør
-  Generisk POSIX-kode burde trolig ringe decode()med tegnsett fraLC_CTYPEmiljøvariabel.
Svar
 Den første kommandoen skriver bare til en fil. Du vil ikke utføre det som en skallkommando fordi python kan lese og skrive til filer uten hjelp fra et skall: 
with open("/proc/sys/net/ipv4/ip_forward", "w") as f: f.write("1")  iptables kommandoen er noe du kanskje vil utføre eksternt. Den beste måten å gjøre dette på er å bruke  underprosessmodul . 
import subprocess subprocess.check_call(["iptables", "-t", "nat", "-A", "PREROUTING", "-p", "tcp", "--destination-port", "80", "-j", "REDIRECT", "--to-port", "8080"]) Merk at denne metoden heller ikke bruker et skall, som er unødvendig overhead.
Svar
Den raskeste måten:
import os os.system("your command here")  Dette er ikke den mest fleksible tilnærmingen ; Hvis du trenger mer kontroll over prosessen enn å «kjøre den en gang, til fullføring, og blokkere til den går ut», bør du bruke subprocess -modulen i stedet. 
Svar
Som en generell regel, vil du bedre bruke pythonbindinger når det er mulig (bedre unntaksfangst, blant andre fordeler.)
 For echo -kommandoen er det åpenbart bedre å bruke python til å skrive i filen som foreslått i svaret til @jordanm. 
 For iptables kommando, kanskje python-iptables ( PyPi-side ,  GitHub-side med beskrivelse og dokument ) vil gi det du trenger (jeg sjekket ikke den spesifikke kommandoen). 
 Dette vil gjøre at du er avhengig av en ekstern lib, så du må veie fordelene. Ved å bruke underprosess fungerer det, men hvis du vil bruke utgangen, må du analysere det selv og håndtere utgangsendringer i fremtidige iptables -versjoner. 
Kommentarer
-  En annen ting å merke seg er at enhetstestkode med subprocesssamtaler er mindre nyttig. Ja, du kan spotte ut samtaler, men testene må gjøre antakelser om resultatene på eksterne samtaler.
- Svaret ditt er mer som råd. OP har spesifikt spurt hvordan han kan kjøre en linux-systemkommando fra python.
- @kapad Ja, men han spesifiserte også hvorfor han ønsket å gjøre det, og jeg foreslo et alternativ.
Svar
En pythonversjon av skallet ditt. Vær forsiktig, jeg har ikke testet den.
from subprocess import run def bash(command): run(command.split()) >>> bash("find / -name null") /dev/null /sys/fs/selinux/null /sys/devices/virtual/mem/null /sys/class/mem/null /usr/lib/kbd/consoletrans/null Kommentarer
-  Strengsplitting fungerer bare for de enkle sakene. For kommandeling av shell-stil, bruk shlex.split
Svar
Hvis du vil utføre denne kommandoen i et annet system etter SSH, må du kanskje bruke modulen som heter Paramiko. Det er veldig nyttig.
Hvis kommandokjøringen må gjøres fra en lokal maskin, vil os-modulfunksjonene være nyttige.
Hjemmeside: https://www.paramiko.org/
Utvikling: https://github.com/paramiko/paramiko
bashvar et oppblåst skall …os.systemanbefaler å brukesubprocess-modul.