Utfør skallkommandoer i Python

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

  • os.system kan gjøre dette.
  • og jeg trodde bash var et oppblåst skall …
  • Dokumentene for os.system anbefaler å bruke subprocess -modul.
  • Trenger du utdata fra iptables?
  • Dette spørsmålet skal overføres til Stackoverflow.

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.system fungerer fremdeles.
  • Hvis du bruker subprocess.call som anbefalt, må du kanskje spesifisere shell=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 fra LC_CTYPE miljø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 subprocess samtaler 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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *