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
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 azshell=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 aLC_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
bash
dagadt héj volt …os.system
dokumentumai a modul.