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

есть ли способ на основе командной строки отправлять пинги на каждый компьютер в подсети? Как

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

для обеспечения разрешения arp?

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

человека:

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

Подробнее: 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:

$ 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 $COUNTER -c 1 -w 400 | grep -B 1 "Lost = 0" &
    COUNTER=$(( $COUNTER + 1 ))
done

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

echo $(seq 254) | xargs -P255 -I% -d" " ping -W 1 -c 1 192.168.0.% | grep -E "[0-1].*?:"
  • Преимущество 1: Вам не нужно устанавливать какой-либо дополнительный инструмент
  • преимущество 2: это быстро. Он делает все параллельно с таймаутом для каждого пинга 1s ("-W 1"). Так что это закончится в 1s:)
  • преимущество 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, как в 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=

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. Вы должны быть в состоянии скопировать и вставить его в Исэ. Затем он запустит команду arp и сохранит результаты в a .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