В момента изучавам тестване за проникване и програмиране на Python. Искам само да знам как да изпълня команда за Linux на Python. Командите, които искам да изпълня, са:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Ако просто използвам print
в Python и я изпълня в терминала, ще се получи ли същото, което се изпълнява, все едно я пишеш сам и натискаш Enter?
Можете да използвате os.system()
по следния начин:
import os
os.system('ls')
Или във вашия случай:
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')
Още по-добре е да използвате извикването на подпроцеса, то е по-безопасно, по-мощно и вероятно по-бързо:
from subprocess import call
call('echo "I like potatos"', shell=True)
Или, без да извиквате shell:
call(['echo', 'I like potatos'])
Ако искате да уловите изхода, един от начините за това е следният:
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))
Препоръчвам ви да зададете timeout
в communicate
, както и да улавяте изключенията, които можете да получите при извикването му. Това е много склонен към грешки код, така че трябва да очаквате грешки и да ги обработвате по съответния начин.
Първата команда просто записва в даден файл. Не бихте я изпълнили като команда от шел, защото python
може да чете и записва във файлове без помощта на шел:
with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
f.write("1")
Командата iptables
е нещо, което може да искате да изпълните външно. Най-добрият начин да направите това е да използвате модула subprocess.
import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
'PREROUTING', '-p', 'tcp',
'--destination-port', '80',
'-j', 'REDIRECT', '--to-port', '8080'])
Обърнете внимание, че този метод също така не използва шел, което е ненужен режимен разход.
Най-бързият начин:
import os
os.system("your command here")
Това не е'най-гъвкавият подход; ако се нуждаете от по-голям контрол над процеса от "стартирайте го веднъж, до завършване, и блокирайте, докато не излезе", тогава трябва да използвате модула subprocess
вместо това.