Saya sedang mempelajari pengujian penetrasi dan pemrograman Python. Saya hanya ingin tahu bagaimana cara menjalankan perintah Linux dengan 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 print
Python dan menjalankannya di terminal, apakah akan melakukan hal yang sama seperti mengeksekusi seolah-olah Anda mengetik sendiri dan menekan Enter?
bash
itu adalah shell yang membengkak ...os.system
direkomendasikan menggunakansubprocess
modul.Jawaban:
Anda dapat menggunakan
os.system()
, seperti ini:Atau dalam kasus Anda:
Lebih baik lagi, Anda dapat menggunakan panggilan subproses, lebih aman, lebih kuat, dan lebih cepat:
Atau, tanpa menggunakan shell:
Jika Anda ingin menangkap output, salah satu cara melakukannya adalah seperti ini:
Saya sangat merekomendasikan pengaturan
timeout
dicommunicate
, dan juga untuk menangkap pengecualian Anda bisa dapatkan ketika menyebutnya. Ini adalah kode yang sangat rawan kesalahan, jadi Anda harus mengharapkan kesalahan terjadi dan menanganinya sesuai.https://docs.python.org/3/library/subprocess.html
sumber
os.system
masih berfungsi.subprocess.call
seperti yang disarankan, Anda mungkin perlu menentukanshell=True
... lihat di sinidecode()
dengan charset dariLC_CTYPE
variabel lingkungan.Perintah pertama hanya menulis ke file. Anda tidak akan menjalankan itu sebagai perintah shell karena
python
dapat membaca dan menulis ke file tanpa bantuan shell:The
iptables
Perintah adalah sesuatu yang Anda mungkin ingin mengeksekusi eksternal. Cara terbaik untuk melakukan ini adalah dengan menggunakan modul subproses .Perhatikan bahwa metode ini juga tidak menggunakan shell, yang merupakan overhead yang tidak perlu.
sumber
Cara tercepat:
Ini bukan pendekatan yang paling fleksibel; jika Anda memerlukan kontrol lebih besar atas proses Anda daripada "jalankan sekali, sampai selesai, dan blokir sampai keluar", maka Anda harus menggunakan
subprocess
modul sebagai gantinya.sumber
Sebagai aturan umum, Anda sebaiknya menggunakan python binding kapan pun memungkinkan (menangkap Pengecualian yang lebih baik, di antara kelebihan lainnya.)
Untuk
echo
perintah, jelas lebih baik menggunakan python untuk menulis dalam file seperti yang disarankan dalam jawaban @ jordanm.Untuk
iptables
perintah, mungkinpython-iptables
( halaman PyPi , halaman GitHub dengan deskripsi dan dokumen ) akan memberikan apa yang Anda butuhkan (saya tidak memeriksa perintah spesifik Anda).Ini akan membuat Anda bergantung pada lib eksternal, jadi Anda harus mempertimbangkan manfaatnya. Menggunakan karya subproses, tetapi jika Anda ingin menggunakan output, Anda harus menguraikan sendiri, dan menangani perubahan output dalam
iptables
versi yang akan datang .sumber
subprocess
panggilan kurang bermanfaat. Ya, Anda dapat mengejek panggilan, tetapi tes harus membuat asumsi tentang hasil pada panggilan eksternal.Versi python dari shell Anda. Hati-hati, saya belum mengujinya.
sumber
Jika Anda ingin menjalankan perintah ini di beberapa sistem lain setelah SSH maka Anda mungkin harus menggunakan modul bernama Paramiko. Ini sangat berguna.
Jika eksekusi perintah harus dilakukan dari mesin lokal maka fungsi modul os akan sangat membantu.
sumber