Héjparancsok végrehajtása a Pythonban

Jelenleg behatolási tesztelést és Python programozást tanulok. Csak azt szeretném tudni, hogyan tudnám végrehajtani a Linux parancs Pythonban történő végrehajtását. A végrehajtani kívánt parancsok a következők:

echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080 

Ha csak a print a Pythonban, és a terminálban futtatja, ugyanazt fogja tenni, mint a végrehajtás, mintha maga írná be, és lenyomná az Enter ?

Megjegyzések

  • os.system képes erre.
  • és gondoltam A bash dagadt héj volt …
  • A os.system dokumentumai a modul.
  • Szüksége van az iptables kimenetére?
  • Ezt a kérdést át kell helyezni a Stackoverflow fájlba.

Válasz

Használhatja a os.system() -t, így:

import os os.system("ls") 

Vagy az Ön esetében:

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") 

Még jobb, ha használhatja az alfolyamat hívását, ez biztonságosabb, erősebb és valószínűleg gyorsabb:

from subprocess import call call("echo "I like potatos"", shell=True) 

Vagy a héj meghívása nélkül:

call(["echo", "I like potatos"]) 

Ha rögzíteni szeretné a kimenetet, ennek egyik módja a következő:

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)) 

Nagyon ajánlom a timeout itt: communicate, és rögzítse azokat a kivételeket is, amelyeket a hívásakor kaphat. Ez egy nagyon hibára hajlamos kód, ezért számolnia kell a hibák előfordulásával, és ennek megfelelően kell kezelnie őket.

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

Megjegyzések

  • Az os rendszer elavult a 2.6 verzió óta. Az alfolyamat a megfelelő modul.
  • @binarysubstrate, elavult, mint a nem támogatott vagy nem elérhető? ‘ Nemrégiben 2,7-es gépen dolgoztam (nem választás szerint), és a os.system továbbra is működik.
  • Továbbá, ha az ajánlott módon használja a subprocess.call alkalmazást, előfordulhat, hogy meg kell adnia az shell=True … lásd: itt
  • Python 3.4 esetén a shell = True értéket kell megadni, különben a call parancs nem fog működni. Alapértelmezés szerint a hívás megpróbálja megnyitni a karakterlánc által megadott fájlt, hacsak a shell = True nincs megadva. Az is látszik, hogy a Python 3.5-ben a hívást futtatással helyettesítik
  • Az általános POSIX-kódnak valószínűleg fel kell hívnia a decode() -et a LC_CTYPE környezeti változó.

Válasz

Az első parancs egyszerűen egy fájlba ír. Nem futtatná ezt shell parancsként, mert a python képes shellek segítsége nélkül írni és olvasni fájlokat:

with open("/proc/sys/net/ipv4/ip_forward", "w") as f: f.write("1") 

A iptables parancsot érdemes külsőleg végrehajtani. A legjobb módszer erre a alfolyamat modul .

import subprocess subprocess.check_call(["iptables", "-t", "nat", "-A", "PREROUTING", "-p", "tcp", "--destination-port", "80", "-j", "REDIRECT", "--to-port", "8080"]) 

Ne feledje, hogy ez a módszer szintén nem használ héjat, ami felesleges általános költség.

Válasz

A leggyorsabb módszer:

import os os.system("your command here") 

Ez nem a legrugalmasabb megközelítés ; Ha több ellenőrzésre van szüksége a folyamat felett, mint az “egyszeri futtatás, a befejezésig, és blokkolja, amíg ki nem lép”, akkor inkább a subprocess modult kell használnia.

Válasz

Általános szabály, hogy ha lehet, jobban használja a python-összerendeléseket (jobb előnyök a kivétel kivételével).

A echo parancsnál nyilvánvaló, hogy jobb, ha a Python segítségével írjuk be a fájlba, ahogy azt a @jordanm válasza javasolja.

iptables parancs, esetleg python-iptables ( PyPi oldal , GitHub oldal a leírással és a dokumentummal ) megadná, amire szüksége van (nem ellenőriztem a konkrét parancsot).

Ez attól függene, hogy egy külső lib, ezért súlyoznod kell az előnyöket. Az alfolyamatok használata, de ha a kimenetet használni szeretné, akkor magának kell elemeznie, és a jövőbeni iptables verziókban kezelnie kell a kimenet változását.

Megjegyzések

  • Egy másik dolog, amit érdemes megjegyezni, hogy az egység tesztelési kódja a subprocess hívásokkal kevésbé hasznos. Igen, kigúnyolhatja a hívásokat, de a teszteknek feltételezéseket kell tenniük a külső hívások eredményeiről.
  • A válasz inkább tanácsot jelent. Az OP kifejezetten megkérdezte, hogyan futtathat egy linuxos rendszert a pythonból.
  • @kapad Igen, de meg is határozta, miért akarja ezt tenni, és javaslatot tettem egy alternatívára.

Válasz

A shelled python verziója. Vigyázz, még nem teszteltem.

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 

Megjegyzések

  • A karakterláncok felosztása csak az egyszerű esetekben működik. A shell-stílusú parancsfelosztáshoz használja shlex.split

Válasz

Ha ezt a parancsot valamilyen más rendszerben szeretné végrehajtani az SSH után, akkor lehet, hogy a Paramiko nevű modult kell használnia. Nagyon hasznos.

Ha a parancs végrehajtását helyi gépről kell végrehajtani, akkor az os modul funkciói hasznosak lesznek.

Honlap: https://www.paramiko.org/

Fejlesztés: https://github.com/paramiko/paramiko

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük