Отправка ping на каждый IP в подсети



Существует ли способ отправки сообщений из командной строки на каждый компьютер в подсети? Как

for(int i = 1; i < 254; i++)
    ping(192.168.1.i);

Чтобы обеспечить выполнение резолюции arp?

209   14  

14 ответов:

Я бы предложил использовать fping с опцией маски, так как вы не ограничиваете себя в ping.

fping -g 192.168.1.0/24

Ответ будет легко разобрать в скрипте:

192.168.1.1 is alive
192.168.1.2 is alive
192.168.1.3 is alive
192.168.1.5 is alive
...
192.168.1.4 is unreachable
192.168.1.6 is unreachable
192.168.1.7 is unreachable
...

Примечание: использование аргумента -a ограничит вывод достижимыми ip-адресами, вы можете использовать его в противном случае fping также будет печатать недостижимые адреса:

fping -a -g 192.168.1.0/24

От человека:

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

Подробнее: http://fping.org/

Не все машины имеют nmap в наличии, но это замечательный инструмент для любого обнаружения сети, и, конечно, лучше, чем перебирать независимые команды ping.

$ nmap -n -sP 10.0.0.0/24

Starting Nmap 4.20 ( http://insecure.org ) at 2009-02-02 07:41 CST
Host 10.0.0.1 appears to be up.
Host 10.0.0.10 appears to be up.
Host 10.0.0.104 appears to be up.
Host 10.0.0.124 appears to be up.
Host 10.0.0.125 appears to be up.
Host 10.0.0.129 appears to be up.
Nmap finished: 256 IP addresses (6 hosts up) scanned in 2.365 seconds

Широковещательный пинг:

$ ping 192.168.1.255
PING 192.168.1.255 (192.168.1.255): 56 data bytes
64 bytes from 192.168.1.154: icmp_seq=0 ttl=64 time=0.104 ms
64 bytes from 192.168.1.51: icmp_seq=0 ttl=64 time=2.058 ms (DUP!)
64 bytes from 192.168.1.151: icmp_seq=0 ttl=64 time=2.135 ms (DUP!)
...

(Добавьте опцию -b в Linux)

В оболочке Bash:

#!/bin/sh

COUNTER=1

while [ $COUNTER -lt 254 ]
do
   ping 192.168.1.$COUNTER -c 1
   COUNTER=$(( $COUNTER + 1 ))
done

Утилита командной строки nmap также может сделать это:

nmap -sP 192.168.1.*

Это модификация ответа @david-rodríguez-dribeas выше, который выполняет все пинги параллельно (гораздо быстрее) и показывает только выходные данные для ip-адресов, которые возвращают пинг.

export COUNTER=1
while [ $COUNTER -lt 255 ]
do
    ping $1$COUNTER -c 1 -w 400 | grep -B 1 "Lost = 0" &
    COUNTER=$(( $COUNTER + 1 ))
done

Я только что подошел к этому вопросу, но ответы меня не удовлетворили. Поэтому я свернул свой собственный:

echo $(seq 254) | xargs -P255 -I% -d" " ping -W 1 -c 1 192.168.0.% | grep -E "[0-1].*?:"
  • Преимущество 1: Вам не нужно устанавливать никаких дополнительных инструментов
  • преимущество 2: это быстро. Он делает все параллельно с таймаутом для каждого пинга 1s ("-W 1"). Так что все закончится через 1С:)
  • преимущество 3: выход такой
64 bytes from 192.168.0.16: icmp_seq=1 ttl=64 time=0.019 ms
64 bytes from 192.168.0.12: icmp_seq=1 ttl=64 time=1.78 ms
64 bytes from 192.168.0.21: icmp_seq=1 ttl=64 time=2.43 ms
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=1.97 ms
64 bytes from 192.168.0.11: icmp_seq=1 ttl=64 time=619 ms

Править: И здесь то же самое, что и в скрипте, ибо когда ваши xargs не имеют флага-P, как это case in openwrt (я только что узнал)

for i in $(seq 255);
do
 ping -W 1 -c 1 10.0.0.$i | grep 'from' &
done
for i in $(seq 1 254); do ping -c1 -t 1 192.168.11.$i; done

Добавление -t 1 ожидает только одну секунду перед выходом. Это значительно повышает скорость, если к этой подсети подключено всего несколько устройств.

FOR /L %i in (1,1,254) DO PING 192.168.1.%i -n 1 -w 100 | for /f "tokens=3 delims=: " %j in ('find /i "TTL="') do echo %j>>IPsOnline.txt

Под linux, я думаю, что ping-b 192.168.1.255 будет работать (192.168.1.255-широковещательный адрес для 192.168.1.* ) однако IIRC, который не работает под windows.

Проверьте, есть ли в этом посте блога то, что вам нужно.

#!/bin/sh

COUNTER=$1

while [ $COUNTER -lt 254 ]
do
 echo $COUNTER
 ping -c 1 192.168.1.$COUNTER | grep 'ms'
 COUNTER=$(( $COUNTER + 1 ))
done

#specify start number like this: ./ping.sh 1
#then run another few instances to cover more ground
#aka one at 1, another at 100, another at 200
#this just finds addresses quicker. will only print ttl info when an address resolves

Я пришел поздно, но вот небольшой скрипт, который я сделал для этой цели, который я запускаю в Windows PowerShell. Вы должны быть в состоянии скопировать и вставить его в ISE. В этом случае выполните команду ARP и сохранить результаты на .txt файл и откройте его в блокноте.

# Declare Variables
$MyIpAddress
$MyIpAddressLast

# Declare Variable And Get User Inputs
$IpFirstThree=Read-Host 'What is the first three octects of you IP addresses please include the last period?'
$IpStart=Read-Host 'Which IP Address do you want to start with? Include NO periods.'
$IpEnd=Read-Host 'Which IP Address do you want to end with? Include NO periods.'
$SaveMyFilePath=Read-Host 'Enter the file path and name you want for the text file results.'
$PingTries=Read-Host 'Enter the number of times you want to try pinging each address.'

#Run from start ip and ping
#Run the arp -a and output the results to a text file
#Then launch notepad and open the results file
Foreach($MyIpAddressLast in $IpStart..$IpEnd)
{$MyIpAddress=$IpFirstThree+$MyIpAddressLast
    Test-Connection -computername $MyIpAddress -Count $PingTries}
arp -a | Out-File $SaveMyFilePath
notepad.exe $SaveMyFilePath
for i in $(seq 1 254); do ping -c1 192.168.11.$i; done
    Ничего не найдено.

Добавить ответ:
Отменить.