Terkadang Anda mungkin memiliki masalah jaringan atau firewall di internal yang memerlukan pemindaian jaringan untuk menemukan alamat IP mana yang digunakan. Untuk tujuan itu, kita dapat menggunakan alat yang sudah jadi seperti nmap, zmap, atau angryIP. Namun jika kita tidak memiliki akses internet untuk mendownload tools tersebut kita bisa melakukan scan dengan hanya menggunakan perintah manual. Namun, pemindaian manual bisa sangat membosankan, dengan pemahaman yang harus dilakukan untuk setiap alamat IP yang diberikan di jaringan kita.
Dengan mempertimbangkan hal di atas, saya akan menunjukkan dalam tutorial ini bagaimana kita dapat mengotomatisasi tugas ini dengan menggunakan Python, mengetahui bahwa python tersedia di hampir semua distro Linux yang tersedia di pasar.
Python adalah pilihan yang sempurna untuk ini karena memungkinkan kita untuk mengotomatisasi setiap tugas yang dapat dijalankan oleh OS, kita hanya perlu menggunakan perpustakaan yang benar.
Menggunakan Perpustakaan Linux dengan Python
Fokus studi kami saat ini adalah perintah ping sweep, untuk mendeteksi semua peralatan yang terhubung dan dihidupkan di jaringan kami. Script yang kami buat membuat ping ke setiap alamat IP di jaringan. Misalnya kita menggunakan subnet mask / 24, itu akan loop hanya melalui 3 oktet pertama dari IP. Hal pertama yang harus kita pertimbangkan untuk skrip ini adalah pustaka sistem mana yang dapat digunakan untuk tugas tersebut, kita harus mengimpor pustaka sys dan subproses. Pustaka ini memungkinkan penggunaan perintah khusus dari interpreter python dan sistem operasi itu sendiri, dalam hal ini Scientific Linux 7.1.
import sys, subprocess
Saya akan menyimpan skrip saya dengan nama networkmonitor.py.
Mendeteksi Argumen yang tepat
Saat kita menjalankan script dengan menggunakan perintah
>>python networkmonitor.py 10.0.0.
di shell, jika argumen pada perintah salah (jika len(sys.argv)<>2:), skrip akan menampilkan contoh yang benar. (cetak "networkmonitor.py 10.0.0.").
Argumennya adalah alamat IP dari subnet yang dipindai, hanya 3 oktet pertama yang digunakan. Jadi jika argumennya benar, maka hasil dari perintah "ping -c1"+sys.argv[1] akan disimpan dalam sebuah variabel, dalam kasus kita adalah cmdping, sys.argv[1] adalah variabel "argumen" dalam modul sys dan akan menyimpan argumen pertama yang diberikan ke skrip. Di lingkungan UNIX kita harus menggunakan ping -c1 karena perintah ping akan berjalan tanpa batas.
if len(sys.argv)<>2:
print "networkmonitor 10.0.0."
Perintah Subproses, argumennya, dan for loop
Pada baris berikutnya dimulai perulangan for, yang dijalankan hingga mencapai batas (kondisi berhenti) yang kita tetapkan, kondisi tersebut adalah range IP yang ingin kita scan. Pada titik ini, penting untuk mempertimbangkan waktu yang dibutuhkan skrip untuk memindai rentang, semakin besar rentang semakin lama skrip akan berjalan. Subprocess.Popen memungkinkan kita meluncurkan perintah shell dan menunggu hingga selesai. Setelah selesai, kami memeriksa status bahwa perintah kembali. Cmdping+str(x), dieksekusi oleh subproses.
Shell=true berarti proses akan dijalankan di Shell. Namun, situs web dokumen Python memperingatkan tentang bahaya menggunakan shell=true, jadi berhati-hatilah dengan perintah yang Anda jalankan. Argumen subprocess.PIPE using as stderr menunjukkan bahwa Python akan membuka pipa ke aliran standar.
for x in range(99,110):
p = subprocess.Popen(cmdping+str(x), shell=True, stderr=subprocess.PIPE)
Dalam hal ini, kami hanya menguji sebelas Alamat IP (dari 99 hingga 110).
Sekarang kita harus memeriksa isi stderr, kita akan berhenti (break) ketika variabel kosong, jika tidak kita tampilkan stdout konten.
out = p.stderr.read(1)
if out == '' and p.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
Kode terakhir ini harus dijalankan jika shell tetap dalam keadaan benar.
Kode Lengkapnya sekarang:
import sys, subprocess
if len(sys.argv)<>2:
print "networkmonitor 10.0.0."
else:
cmdping ="ping -c1 "+sys.argv[1]
for x in range(99,110):
p = subprocess.Popen(cmdping+str(x), shell=True, stderr=subprocess.PIPE)
while True:
out = p.stderr.read(1)
if out == '' and p.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
Output dari skrip kecil kami adalah:
Seperti terlihat pada screenshot, alat ini hanya melakukan ping untuk mendapatkan jawaban positif atau negatif kemudian pindah ke alamat IP berikutnya, dan seterusnya untuk menganalisis seluruh rentang alamat.
Harus disebutkan bahwa saya tidak mengklaim kepemilikan kode yang dianalisis di atas. Saya hanya menjelaskan fungsinya selangkah demi selangkah untuk mendapatkan pemahaman yang lebih baik tentang perintah sistem dan fungsi jaringan. Saya akan memberikan kredit kepada penulisnya.