"Python" apvalkalo komandų vykdymas

Šiuo metu studijuoju įsiskverbimo testavimą ir "Python" programavimą. Noriu sužinoti, kaip man reikėtų vykdyti "Linux" komandą "Python" kalba. Komandos, kurias noriu įvykdyti, yra šios:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080

Jei tiesiog panaudosiu print Python ir paleisiu ją terminale, ar ji bus įvykdyta taip pat, lyg ją rašytum pats ir spaustum Enter?

Sprendimas

Galite naudoti os.system(), pavyzdžiui, taip:

import os
os.system('ls')

Arba jūsų atveju:

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

Dar geriau, galite naudoti subproceso iškvietimą, jis saugesnis, galingesnis ir greičiausiai greitesnis:

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

Arba nesikreipiant į apvalkalą:

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

Jei norite užfiksuoti išvestį, vienas iš būdų tai padaryti yra toks:

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

Labai rekomenduoju komunikacijoje nustatyti timeout, taip pat fiksuoti išimtis, kurias galite gauti ją iškvietę. Tai labai į klaidas linkęs kodas, todėl turėtumėte tikėtis, kad klaidų pasitaikys, ir atitinkamai jas tvarkyti.

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

Komentarai (5)

Pirmoji komanda tiesiog įrašo į failą. Jos nevykdytumėte kaip apvalkalo komandos, nes python gali skaityti ir rašyti į failus be apvalkalo pagalbos:

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

Komandą iptables galbūt norėsite vykdyti išoriškai. Geriausias būdas tai padaryti - naudoti subproceso modulį.

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

Atkreipkite dėmesį, kad šis būdas taip pat nenaudoja apvalkalo, o tai yra nereikalingos pridėtinės išlaidos.

Komentarai (0)

Greičiausias būdas:

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

Tai nėra pats lanksčiausias būdas; jei jums reikia daugiau proceso kontrolės, nei "paleisti jį vieną kartą iki galo ir blokuoti, kol jis baigsis", tuomet turėtumėte naudoti subproceso modulį.

Komentarai (0)