Pythonis shell käskude täitmine

Ma'õpin praegu penetratsioonitestimist ja Python programmeerimist. Ma tahan lihtsalt teada, kuidas ma läheksin Linuxi käsu täitmiseks Pythonis. Käsklused, mida ma tahan täita, on järgmised:

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

Kui ma kasutan Pythonis lihtsalt print ja käivitan selle terminalis, kas see teeb sama, kui seda täita, kui oleks ise sisestanud ja vajutanud Enter?

Lahendus

Võite kasutada os.system(), näiteks nii:

import os
os.system('ls')

Või teie puhul:

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

Veel parem on kasutada subprocess'i kutset, see on turvalisem, võimsam ja tõenäoliselt ka kiirem:

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

Või ilma shell'i kutsumata:

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

Kui soovite väljundi jäädvustada, on üks võimalus seda teha nii:

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

Ma suurelt soovitan timeouti seadistada communicate-sse ja ka tabada erandeid, mida saad selle kutsumisel. See on väga vigaohtlik kood, nii et sa peaksid ootama vigade tekkimist ja neid vastavalt käitlema.

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

Kommentaarid (5)

Esimene käsk lihtsalt kirjutab faili. Sa ei viiks seda täide shell'i käsuna, sest python oskab lugeda ja kirjutada failidesse ilma shell'i abita:

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

Käsk iptables on midagi sellist, mida te võiksite täita väliselt. Parim viis seda teha on kasutada subprocess moodulit.

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

Pange tähele, et ka see meetod ei kasuta shell'i, mis on ebavajalik lisakulu.

Kommentaarid (0)

Kiireim viis:

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

See ei ole kõige paindlikum lähenemine; kui teil on vaja rohkem kontrolli oma protsessi üle kui "käivitage see üks kord, kuni lõpetamiseni ja blokeerige, kuni ta väljub", siis peaksite selle asemel kasutama moodulit subprocess.

Kommentaarid (0)