Catatan untuk pembaca : Jawaban orisinal telah diposting beberapa waktu yang lalu dan pada saat saya hanya belajar skrip shell. Lihat versi yang ditinjau di bawah untuk skrip baru dan lebih baik yang berkinerja lebih cepat.
Jawaban Asli
nmap
akan menjadi pilihan # 1 saya, tetapi bagaimana jika Anda tidak memilikinya? Cara DIY akan dengan skrip ping yang melewati setiap alamat ip yang mungkin pada jaringan secara manual. Apa yang kita miliki di sini adalah hanya sementara loop, di mana kita menetapkan angka terakhir di alamat, melakukan ping tunggal diam ke alamat, memeriksa apakah perintah berhasil atau tidak (dan jika itu berhasil, maka host jelas naik), dan printf
pernyataan. Cara cepat dan kotor, butuh sekitar 10 menit untuk menulisnya, tetapi runtime mungkin agak lambat.
#!/bin/sh
# set -x
NUM=1
while [ $NUM -lt 256 ];do
ping -q -c 1 192.168.0.$NUM > /dev/null
RESULT=$(echo $?)
if [ $RESULT -eq 0 ]; then
printf 192.168.0.$NUM"\n"
fi
NUM=$(expr $NUM + 1)
done
Jawaban yang Telah Direvisi
Saya awalnya memposting jawaban ini pada Agustus 2015. Sejak itu saya telah belajar sedikit lebih banyak tentang skrip shell, dan saya pernah melihat skrip ini, saya pikir akan lebih baik untuk meninjau kembali jawaban ini untuk menambahkan beberapa perbaikan. Berikut beberapa ide:
Scriptnya jelas lambat dan ping
menunggu respons dari tuan rumah. Secara default, ping
untuk dua RTT, yang dapat bervariasi tergantung pada seberapa padat jaringan Anda, dan sejauh yang saya mengerti protokol TCP menggandakan waktu tunggu setiap kali (setidaknya sesuai dengan ini ). Jadi kami bisa memaksakan ping
waktu dengan -w 1
bendera. Karena kami memiliki 256 alamat dan kami mengasumsikan 1 detik untuk setiap alamat, skrip akan memakan waktu sekitar 256/60 = 4,27 menit.
Melakukan perintah dan kemudian menangkap status keluarnya dengan $?
benar-benar tidak perlu. The if ... then;...fi
dapat beroperasi pada perintah langsung. Dengan kata lain, cukup untuk melakukan ini:
if ping -w 1 -q -c 1 192.168.0.$NUM > /dev/null ;
then
<some other code here>
fi
The printf
perintah dapat ditulis ulang sebagai begitu:
printf "IP %s is up\n" 192.168.0."$NUM"
Ini lebih merupakan perubahan gaya, tapi ini konsisten dengan cara printf
kerjanya dan terlihat seperti di banyak bahasa lain, dengan "$NUM"
variabel kutip . Mengutip di sini tidak perlu - karena kita hanya berurusan dengan angka, kita tidak perlu mengantisipasi pemisahan kata karena memiliki spasi dalam variabel.
Peningkatan kinerja yang jauh lebih baik dapat dicapai jika kita menelurkan beberapa proses latar belakang. Sunting script di bawah ini tidak persis seperti itu. Saya menempatkan ping
dan printf
ke dalam fungsi, pingf
(ya, nama klise, saya tahu). Sekarang, ada juga satu main
fungsi tunggal yang melakukan perulangan dan pemanggilan pingf
.
#!/bin/sh
# Uncomment for debugging
#set -x
pingf(){
if ping -w 2 -q -c 1 192.168.0."$1" > /dev/null ;
then
printf "IP %s is up\n" 192.168.0."$1"
fi
}
main(){
NUM=1
while [ $NUM -lt 255 ];do
pingf "$NUM" &
NUM=$(expr "$NUM" + 1)
done
wait
}
main
Seberapa baik cara kerjanya? Tidak buruk, sebenarnya, membutuhkan waktu beberapa detik.
$ time ./ping_script.sh
IP 192.168.0.1 is up
IP 192.168.0.101 is up
IP 192.168.0.27 is up
IP 192.168.0.29 is up
0m02.50s real 0m00.01s user 0m00.12s system
Hal-hal yang Perlu Diingat
- Windows (mulai sejak Windows 7, saya pikir) sudah mulai memblokir respons terhadap permintaan gema ICMP. Ada beberapa pertanyaan tentang hal itu di Ask Ubuntu dan situs lain yang sejenis, "Hei, komputer Linux saya bisa di-ping, tetapi tidak pada Windows, ada apa dengan itu?" Perlu diketahui fakta bahwa untuk versi Windows yang lebih baru Anda perlu mengaktifkan respons terhadap gema ICMP.
angry ip scanner