Ich studiere gerade Penetrationstests und Python-Programmierung. Ich möchte nur wissen, wie ich einen Linux-Befehl in Python ausführen kann. 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 einfach print
in Python verwende und es im Terminal ausführe, wird es dann dasselbe tun, als würde man es selbst eintippen und Enter drücken?
Sie können os.system()
wie folgt verwenden:
import os
os.system('ls')
Oder in deinem 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')
Noch besser ist es, wenn Sie den Aufruf eines Unterprozesses verwenden. Das ist sicherer, leistungsfähiger und wahrscheinlich schneller:
from subprocess import call
call('echo "I like potatos"', shell=True)
Oder, ohne Shell-Aufruf:
call(['echo', 'I like potatos'])
Wenn Sie die Ausgabe aufzeichnen wollen, können Sie dies folgendermaßen tun:
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 sehr, ein Timeout
in communicate
zu setzen, und auch die Ausnahmen zu erfassen, die beim Aufruf auftreten können. Dies ist ein sehr fehleranfälliger Code, also sollten Sie mit Fehlern rechnen und sie entsprechend behandeln.
Der erste Befehl schreibt einfach in eine Datei. Sie würden das nicht als Shell-Befehl ausführen, weil 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 iptables
-Befehl ist etwas, das Sie vielleicht von außen ausführen wollen. Der beste Weg, dies zu tun, ist, das subprocess module zu benutzen.
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.
Der schnellste Weg:
import os
os.system("your command here")
Dies ist nicht der flexibelste Ansatz; wenn Sie mehr Kontrolle über Ihren Prozess brauchen als "ihn einmal ausführen, bis zum Ende, und blockieren, bis er beendet wird", dann sollten Sie stattdessen das Modul subprocess
verwenden.