Obecnie studiuję testy penetracyjne i programowanie w języku Python. Chcę tylko wiedzieć, jak bym wykonał polecenie Linuksa w Pythonie. Polecenia, które chcę wykonać, to:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Jeśli po prostu print
użyję w Pythonie i uruchomię go w terminalu, czy będzie on działał tak samo jak wykonywanie go tak, jakbyś pisał go sam i naciskał Enter?
bash
toos.system
polecają korzystanie zsubprocess
modułu.Odpowiedzi:
Możesz użyć
os.system()
takiego:Lub w twoim przypadku:
Co więcej, możesz użyć połączenia podprocesu, jest to bezpieczniejsze, potężniejsze i prawdopodobnie szybsze:
Lub bez wywoływania powłoki:
Jeśli chcesz przechwycić dane wyjściowe, możesz to zrobić w następujący sposób:
Ja bardzo polecam ustawienie
timeout
incommunicate
, a także przechwytywać wyjątków można uzyskać podczas wywoływania go. Jest to bardzo podatny na błędy kod, więc należy spodziewać się, że wystąpią błędy i odpowiednio je obsłużyć.https://docs.python.org/3/library/subprocess.html
źródło
os.system
nadal działa.subprocess.call
zgodnie z zaleceniami, może być konieczne określenieshell=True
... patrz tutajdecode()
pomocą zestawu znaków zeLC_CTYPE
zmiennej środowiskowej.Pierwsze polecenie po prostu zapisuje do pliku. Nie wykonałbyś tego jako polecenia powłoki, ponieważ
python
może czytać i zapisywać pliki bez pomocy powłoki:iptables
Komenda jest coś może chcesz wykonać na zewnątrz. Najlepszym sposobem na to jest użycie modułu podprocesu .Zauważ, że ta metoda również nie używa powłoki, co jest niepotrzebnym narzutem.
źródło
Najszybszy sposób:
To nie jest najbardziej elastyczne podejście; jeśli potrzebujesz więcej kontroli nad procesem niż „uruchom go raz, do końca i blokuj, aż zakończy się”, powinieneś
subprocess
zamiast tego użyć modułu.źródło
Zasadniczo lepiej używać powiązań pytona, gdy tylko jest to możliwe (między innymi lepsze przechwytywanie wyjątków).
W przypadku
echo
polecenia lepiej jest użyć Pythona do zapisu w pliku, jak sugeruje odpowiedź @ jordanm.Do
iptables
polecenia, możepython-iptables
( strona PyPI , GitHub strona z opisem i doc ) stanowiłaby co trzeba (nie sprawdzić konkretną komendę).To sprawi, że będziesz zależał od zewnętrznej biblioteki lib, więc musisz rozważyć korzyści. Korzystanie z podprocesu działa, ale jeśli chcesz użyć danych wyjściowych, musisz je przeanalizować samodzielnie i poradzić sobie ze zmianami danych wyjściowych w przyszłych
iptables
wersjach.źródło
subprocess
połączeniami jest mniej przydatny. Tak, możesz wyśmiewać połączenia, ale testy muszą opierać się na wynikach połączeń zewnętrznych.Pythonowa wersja twojej powłoki. Uważaj, nie testowałem tego.
źródło
Jeśli chcesz wykonać to polecenie w innym systemie po SSH, być może będziesz musiał użyć modułu o nazwie Paramiko. To jest naprawdę przydatne.
Jeśli wykonanie polecenia musi być wykonane z lokalnego komputera, pomocne będą funkcje modułu os.
źródło