скрипт для сканирования диапазона ip и возврата результатов в определенном формате

Этот скрипт сканирует IP и возвращает статус Up или Down. Как я могу изменить его, чтобы он не сканировал все дважды? Когда он сидит, он сканирует все и возвращает только адреса «Вверх», а затем снова просматривает и возвращает только адреса статуса «Вниз».

#!/bin/bash is_alive_ping() { ping -c 1 $1 > /dev/null [ $? -eq 0 ] && echo $i,Up [ $? -eq 1 ] && echo $i,Down } for i in 10.1.150.{1..10} do is_alive_ping $i & disown done 

Бонусные баллы, если кто-то может это сделать, также возвращают DNS-имя IP, если оно есть.

Заранее спасибо.

5 Solutions collect form web for “скрипт для сканирования диапазона ip и возврата результатов в определенном формате”

Скрипт сканирует каждый IP только один раз. Сканирование происходит в фоновом режиме ( & ). Понижение IP-адресов занимает больше времени, поэтому они сообщаются позже.

Вы ищете nmap .

 # nmap -sP 10.1.150.1-10 Starting Nmap 5.00 ( http://nmap.org ) at 2012-01-04 00:02 CET Host foo.example.com (10.1.150.2) is up (0.00066s latency). Host bar.example.com (10.1.150.7) is up (0.00066s latency). Nmap done: 10 IP addresses (1 host up) scanned in 1.41 seconds 

ping-повторы для неактивных узлов, что добавляет задержку в предоставлении информации о доступности узлов обратно на консольный вывод, в то время как ответные онлайн-узлы немедленно сообщаются. ping имеет такой недостаток, что вам нужно выполнить его для каждого хоста.

Используйте fping, лучшую альтернативу ping, которая может выполнять параллельный пинг на хостах, источник доступен в sourceforge http://fping.sourceforge.net/ . Скачайте fping и установите его под / usr / local / sbin и сделайте это suid.

Вот пример perl, который может сообщить о недостижимых узлах в конце, тогда как узлы, которые находятся в сети, сообщаются с их именами DNS, вы можете передать выходные данные этого скрипта таким инструментам, как grep или awk снова, чтобы работать с нужным вывод.

 #!/usr/bin/perl require 'open2.pl'; use Net::IP; $pid = &open2("OUTPUT","INPUT","/usr/local/sbin/fping -d"); @check=(); my $ip = new Net::IP ('98.137.149.56 - 98.137.149.100') || die "Unable to generate range\n"; do { push (@check, $ip->ip()); } while (++$ip); foreach(@check) { print INPUT "$_\n"; } close(INPUT); while(<OUTPUT>) { print "$_"; } close(OUTPUT); 

Если вы хотите сохранить заказ, вам нужно перенаправить вывод не на stdout, а в файлы. После того, как все пинги завершены, wait пока не закончится последний фоновый процесс. Затем поместите файлы результатов в «правильный» порядок.

добавление -w в ping позволит значительно ускорить процесс.

 #!/bin/bash is_alive_ping() { ping -c 1 -w 1 $1 > /dev/null [ $? -eq 0 ] && echo $i ,Alive } for i in 192.168.213.{1..254} do is_alive_ping $i & done 
Linux и Unix - лучшая ОС в мире.