Ich studiere derzeit Penetrationstests und Python-Programmierung. Ich möchte nur wissen, wie ich einen Linux-Befehl in Python ausführen würde. Die Befehle, die ich ausführen möchte, sind:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Wenn ich nur print
Python verwende und es im Terminal ausführe, wird es genauso ausgeführt, als ob Sie es selbst tippen und drücken würden Enter?
bash
es wäre eine aufgeblähte Muschel ...os.system
empfiehlt die Verwendung dessubprocess
Moduls.Antworten:
Sie können
os.system()
wie folgt verwenden:Oder in deinem Fall:
Besser noch, Sie können den Aufruf des Unterprozesses verwenden, er ist sicherer, leistungsfähiger und wahrscheinlich schneller:
Oder, ohne Shell aufzurufen:
Wenn Sie die Ausgabe erfassen möchten, gehen Sie folgendermaßen vor:
Ich empfehle dringend , ein
timeout
in zu setzencommunicate
und auch die Ausnahmen zu erfassen, die Sie erhalten, wenn Sie es aufrufen. Dies ist ein sehr fehleranfälliger Code. Sie sollten also damit rechnen, dass Fehler auftreten, und diese entsprechend behandeln.https://docs.python.org/3/library/subprocess.html
quelle
os.system
noch.subprocess.call
wie empfohlen verwenden, müssen Sie möglicherweise angeben,shell=True
... siehe hierdecode()
mit einem Zeichensatz aus einerLC_CTYPE
Umgebungsvariablen aufgerufen werden.Der erste Befehl schreibt einfach in eine Datei. Das würden Sie nicht als Shell-Befehl ausführen, da Sie
python
ohne die Hilfe einer Shell in Dateien lesen und schreiben können:Der
iptables
Befehl kann extern ausgeführt werden. Der beste Weg, dies zu tun, ist die Verwendung des Unterprozessmoduls .Beachten Sie, dass diese Methode auch keine Shell verwendet, was unnötigen Overhead bedeutet.
quelle
Der schnellste Weg:
Dies ist nicht der flexibelste Ansatz. Wenn Sie mehr Kontrolle über Ihren Prozess benötigen, als "ihn einmal bis zum Abschluss ausführen und blockieren, bis er beendet wird", sollten Sie
subprocess
stattdessen das Modul verwenden.quelle
In der Regel sollten Sie nach Möglichkeit Python-Bindungen verwenden (unter anderem besseres Abfangen von Ausnahmen).
Für den
echo
Befehl ist es offensichtlich besser, Python zu verwenden, um in die Datei zu schreiben, wie in der Antwort von @ jordanm vorgeschlagen.Für den
iptables
Befehl würde möglicherweisepython-iptables
( PyPi-Seite , GitHub-Seite mit Beschreibung und Dokument ) angegeben, was Sie benötigen (ich habe Ihren spezifischen Befehl nicht überprüft).Dies würde Sie von einer externen Bibliothek abhängig machen, sodass Sie die Vorteile abwägen müssen. Verwenden von Unterprozessen funktioniert, aber wenn Sie die Ausgabe verwenden möchten, müssen Sie sie selbst analysieren und in zukünftigen
iptables
Versionen mit Änderungen der Ausgabe umgehen .quelle
subprocess
Aufrufen weniger nützlich ist. Ja, Sie können die Anrufe verspotten, aber die Tests müssen Annahmen über die Ergebnisse der externen Anrufe treffen.Eine Python-Version Ihrer Shell. Sei vorsichtig, ich habe es nicht getestet.
quelle
Wenn Sie diesen Befehl in einem anderen System nach SSH ausführen möchten, müssen Sie möglicherweise das Modul namens Paramiko verwenden. Es ist wirklich nützlich.
Wenn die Befehlsausführung von einem lokalen Computer aus erfolgen muss, sind die Funktionen des OS-Moduls hilfreich.
quelle