Şu anda sızma testi ve Python programlama üzerine çalışıyorum. Sadece Python'da bir Linux komutunu nasıl çalıştıracağımı bilmek istiyorum. Çalıştırmak istediğim komutlar şunlar:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Python'da sadece print
kullansam ve terminalde çalıştırsam, sanki kendiniz yazıyormuşsunuz ve Enter tuşuna basıyormuşsunuz gibi çalıştırmakla aynı şeyi yapar mı?
Bunun gibi os.system()
kullanabilirsiniz:
import os
os.system('ls')
Ya da senin durumunda:
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')
Daha da iyisi, alt süreç çağrısını kullanabilirsiniz, bu daha güvenli, daha güçlü ve muhtemelen daha hızlıdır:
from subprocess import call
call('echo "I like potatos"', shell=True)
Ya da kabuk çağırmadan:
call(['echo', 'I like potatos'])
Çıktıyı yakalamak istiyorsanız, bunu yapmanın bir yolu şudur:
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))
İletişim'de bir `zaman aşımı' ayarlamanızı ve ayrıca onu çağırırken alabileceğiniz istisnaları yakalamanızı şiddetle tavsiye ederim. Bu çok hata eğilimli bir koddur, bu nedenle hataların olmasını beklemeli ve bunları uygun şekilde ele almalısınız.
İlk komut basitçe bir dosyaya yazar. Bunu bir kabuk komutu olarak çalıştıramazsınız çünkü python
bir kabuk yardımı olmadan dosyaları okuyabilir ve yazabilir:
with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
f.write("1")
iptables` komutu harici olarak çalıştırmak isteyebileceğiniz bir şeydir. Bunu yapmanın en iyi yolu subprocess module kullanmaktır.
import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
'PREROUTING', '-p', 'tcp',
'--destination-port', '80',
'-j', 'REDIRECT', '--to-port', '8080'])
Bu yöntemin gereksiz bir ek yük olan kabuk kullanmadığını da unutmayın.
En hızlı yol:
import os
os.system("your command here")
Bu en esnek yaklaşım değildir; eğer süreciniz üzerinde "bir kez çalıştır, tamamla ve çıkana kadar engelle" den daha fazla kontrole ihtiyacınız varsa, bunun yerine subprocess
modülünü kullanmalısınız.