Подтвердить что ты не робот

Отправлять пинг для каждого IP-адреса в подсети

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

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

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

4b9b3361

Ответ 1

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

fping -g 192.168.1.0/24

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

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 отличается от ping тем, что вы можете указать любое количество целей в командной строке или указать файл, содержащий списки целей к ping. Вместо отправки одной цели до тех пор, пока она не выйдет из строя или ответы fping отправят пакет ping и перейдут к следующему цели в круговом режиме.

Дополнительная информация: http://fping.org/

Ответ 2

Не все машины имеют 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

Ответ 3

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

$ 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)

Ответ 4

В Bash оболочке:

#!/bin/sh

COUNTER=1

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

Ответ 5

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

nmap -sP 192.168.1.*

Ответ 6

Это модификация ответа @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

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 11

for i in $(seq 1 254); do ping -c1 -t 1 192.168.11.$i; done

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

Ответ 12

#!/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

Ответ 13

for i in $(seq 1 254); do ping -c1 192.168.11.$i; done