Führen Sie Shell-Befehle in Python

aus. 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 in Python und führen Sie es im Terminal aus. Dies entspricht der Ausführung, als würden Sie es selbst eingeben und die Eingabetaste drücken?

Kommentare

  • os.system kann dies.
  • und ich dachte bash war eine aufgeblähte Shell …
  • In den Dokumenten für os.system wird die Verwendung von -Modul.
  • Benötigen Sie die Ausgabe von iptables?
  • Diese Frage sollte nach Stackoverflow migriert werden.

Antwort

Sie können os.system() wie folgt verwenden:

import os os.system("ls") 

Oder in Ihrem Fall:

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

Besser noch, Sie können den Aufruf des Unterprozesses verwenden sicherer, leistungsfähiger und wahrscheinlich schneller:

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

Oder ohne Shell aufzurufen:

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

Wenn Sie die Ausgabe erfassen möchten, gehen Sie folgendermaßen vor:

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

Ich empfehle dringend, a einzustellen timeout in communicate und auch zum Erfassen der Ausnahmen, die beim Aufrufen auftreten können. Dies ist ein sehr fehleranfälliger Code. Sie sollten daher damit rechnen, dass Fehler auftreten, und sie entsprechend behandeln.

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

Kommentare

  • os.system ist seit Version 2.6 veraltet. Der Unterprozess ist das richtige Modul.
  • @binarysubstrate, veraltet wie in nicht unterstützt oder nicht verfügbar? Ich ‚ habe kürzlich mit 2.7 (nicht nach Wahl) an einem Computer gearbeitet, und os.system funktioniert immer noch.
  • Wenn Sie subprocess.call wie empfohlen verwenden, müssen Sie möglicherweise shell=True angeben … siehe hier
  • Bei Python 3.4 muss die Shell = True angegeben werden, da sonst der Aufrufbefehl nicht funktioniert. Standardmäßig versucht call, eine durch die Zeichenfolge angegebene Datei zu öffnen, es sei denn, die Shell = True ist festgelegt. Es sieht auch so aus, als würde der Aufruf in Python 3.5 durch run
  • ersetzt. Generischer POSIX-Code sollte wahrscheinlich decode() mit einem Zeichensatz von LC_CTYPE Umgebungsvariable.

Antwort

Der erste Befehl schreibt einfach in eine Datei. Sie würden dies nicht als Shell-Befehl ausführen, da python Dateien ohne die Hilfe einer Shell lesen und schreiben kann:

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

Der Befehl iptables möchten Sie möglicherweise extern ausführen. Der beste Weg, dies zu tun, ist die Verwendung von Unterprozessmodul .

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

Beachten Sie, dass diese Methode auch keine Shell verwendet, was unnötigen Overhead bedeutet.

Antwort

Der schnellste Weg:

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

Dies ist nicht der flexibelste Ansatz ;; Wenn Sie mehr Kontrolle über Ihren Prozess benötigen als „einmal bis zum Abschluss ausführen und blockieren, bis er beendet wird“, sollten Sie stattdessen das Modul subprocess verwenden.

Antwort

In der Regel sollten Sie nach Möglichkeit besser Python-Bindungen verwenden (unter anderem besseres Ausfangen von Ausnahmen).

Für den Befehl echo ist es offensichtlich besser, Python zum Schreiben in die Datei zu verwenden, wie in der Antwort von @jordanm vorgeschlagen.

Für den Befehl iptables Befehl, möglicherweise python-iptables ( PyPi-Seite , GitHub-Seite mit Beschreibung und Dokument ) würde das liefern, was Sie benötigen (ich habe Ihren spezifischen Befehl nicht überprüft).

Dies würde Sie von einem abhängig machen externe lib, so müssen Sie die Vorteile abwägen. Die Verwendung von Unterprozessen funktioniert, aber wenn Sie die Ausgabe verwenden möchten, müssen Sie sie selbst analysieren und Änderungen an der Ausgabe in zukünftigen iptables -Versionen vornehmen.

Kommentare

  • Eine andere Sache zu beachten ist, dass Unit-Test-Code mit subprocess -Aufrufen weniger nützlich ist. Ja, Sie können das verspotten Aufrufe, aber die Tests müssen Annahmen über die Ergebnisse der externen Anrufe treffen.
  • Ihre Antwort ist eher ein Ratschlag. Das OP hat speziell gefragt, wie er einen Linux-Systembefehl von Python aus ausführen kann.
  • @kapad Ja, aber er hat auch angegeben, warum er dies tun wollte, und ich habe eine Alternative vorgeschlagen.

Antwort

Eine Python-Version Ihrer Shell. Seien Sie vorsichtig, ich habe sie nicht getestet.

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 

Kommentare

  • Die Aufteilung von Zeichenfolgen funktioniert nur in einfachen Fällen. Verwenden Sie für die Aufteilung von Befehlen im Shell-Stil shlex.split

Antwort

Wenn Sie diesen Befehl nach SSH in einem anderen System ausführen möchten, müssen Sie möglicherweise das Modul Paramiko verwenden. Dies ist sehr nützlich.

Wenn die Befehlsausführung von einem lokalen Computer aus erfolgen muss, sind die Funktionen des Betriebssystemmoduls hilfreich.

Homepage: https://www.paramiko.org/

Entwicklung: https://github.com/paramiko/paramiko

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.