I'm saat ini sedang belajar pengujian penetrasi dan pemrograman Python. Aku hanya ingin tahu bagaimana aku akan pergi tentang melaksanakan perintah Linux di Python. Perintah yang ingin saya jalankan adalah:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Jika saya hanya menggunakan cetak
di Python dan menjalankannya di terminal itu akan melakukan hal yang sama seperti yang mengeksekusi itu seperti jika anda mengetik sendiri dan menekan Enter?
Anda dapat menggunakan os.sistem()
, seperti ini:
import os
os.system('ls')
Atau dalam kasus anda:
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')
Lebih baik lagi, anda dapat menggunakan subproses's call, lebih aman, lebih kuat dan mungkin lebih cepat:
from subprocess import call
call('echo "I like potatos"', shell=True)
Atau, tanpa melibatkan shell:
call(['echo', 'I like potatos'])
Jika anda ingin menangkap output, salah satu cara untuk melakukannya adalah seperti ini:
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))
Saya sangat merekomendasikan pengaturan timeout
di berkomunikasi
, dan juga untuk menangkap pengecualian bisa anda dapatkan ketika menyebutnya. Ini adalah sangat rawan kesalahan kode, sehingga anda harus mengharapkan kesalahan terjadi dan menangani mereka sesuai.
Perintah pertama hanya menulis ke sebuah file. Anda tidak't melakukan itu sebagai perintah shell karena python
dapat membaca dan menulis ke file tanpa bantuan shell:
with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
f.write("1")
The iptables
perintah adalah sesuatu yang anda mungkin ingin menjalankan eksternal. Cara terbaik untuk melakukan ini adalah dengan menggunakan subproses modul.
import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
'PREROUTING', '-p', 'tcp',
'--destination-port', '80',
'-j', 'REDIRECT', '--to-port', '8080'])
Perhatikan bahwa metode ini juga tidak menggunakan sebuah shell, yang merupakan overhead yang tidak perlu.
Cara tercepat:
import os
os.system("your command here")
Ini isn't yang paling fleksibel pendekatan; jika anda membutuhkan lebih banyak kontrol atas proses anda dari "lari itu sekali, untuk penyelesaian, dan blok sampai keluar", maka anda harus menggunakan subproses
modul sebaliknya.
Sebagai aturan umum, anda'd lebih baik menggunakan python binding bila mungkin (lebih baik Terkecuali penangkapan, di antara keuntungan lainnya.)
Untuk echo
perintah,'s jelas lebih baik untuk menggunakan python untuk menulis di file seperti yang disarankan di @jordanm's jawaban.
Untuk iptables
perintah, mungkin python-iptables
(PyPi halaman, halaman GitHub dengan deskripsi dan doc) akan memberikan apa yang anda butuhkan (aku't periksa perintah tertentu).
Hal ini akan membuat anda tergantung pada eksternal lib, sehingga anda memiliki berat badan manfaat. Menggunakan subproses bekerja, tetapi jika anda ingin menggunakan output, anda'll harus mengurai diri sendiri, dan bergerak dengan output perubahan di masa depan iptables
versi.
Python versi dari shell anda. Hati-hati, aku ingin't diuji.
from subprocess import run
def bash(command):
run(command.split())
>>> bash('find / -name null')
/dev/null
/sys/fs/selinux/null
/sys/devices/virtual/mem/null
/sys/class/mem/null
/usr/lib/kbd/consoletrans/null
Jika anda ingin menjalankan perintah ini di beberapa sistem lain setelah SSH maka anda mungkin harus menggunakan modul yang bernama Login. Hal ini benar-benar berguna.
Jika perintah eksekusi harus dilakukan dari mesin lokal kemudian os modul fungsi akan sangat membantu.
Homepage: https://www.paramiko.org/
Pengembangan: https://github.com/paramiko/paramiko