В моей работе много компьютера, и я хочу шутить. Я могу закрыть компьютер по сети, но найти IP-адреса мне сложно.
Как я могу легко найти все онлайн-адреса IP от 192.168.1.aa до 192.168.1.zz?
В моей работе много компьютера, и я хочу шутить. Я могу закрыть компьютер по сети, но найти IP-адреса мне сложно.
Как я могу легко найти все онлайн-адреса IP от 192.168.1.aa до 192.168.1.zz?
Как правило, nmap
весьма полезно для быстрого сканирования сетей.
Чтобы установить nmap, введите в терминал следующую команду:
sudo apt-get install nmap
Как только приложение будет установлено, введите следующую команду:
nmap -sn 192.168.1.0/24
Это покажет, какие хосты ответили на запросы ping в сети между 192.168.1.0 и 192.168.1.255.
Для более старых версий Nmap используйте -sP
:
nmap -sP 192.168.1.0/24
Дополнительные ссылки см. на следующих страницах:
Справочное руководство по NMAP
Это очень полезный инструмент для изучения.
Если все компьютеры в вашей сети - Ubuntu или любой другой дистрибутив, который использует avahi-daemon
( DNS-SD ) ), вы можете получить подробный список из них (с именем хоста и IP-адресом), выполнив:
avahi-browse -rt _workstation._tcp
Если вы хотите узнать все IP-адреса, используемые в вашей сети, вы можете использовать arp-scan
:
sudo arp-scan 192.168.1.0/24
Поскольку он не установлен по умолчанию, вам придется установить его с помощью sudo apt-get install arp-scan
. arp-scan
отправляет ARP-пакеты в локальную сеть и отображает полученные ответы, поэтому он показывает даже брандмауэр-хосты (блокирующие трафик на основе IP-пакетов).
Примечание для читателя . Оригинальный ответ был опубликован некоторое время назад и в то время, когда я только изучал сценарии оболочки. См. Обновленную версию ниже для нового и улучшенного сценария, который выполняется намного быстрее.
nmap
будет моим выбором # 1, но что, если у вас его нет? Метод DIY будет иметь скрипт ping, который будет проходить через каждый возможный IP-адрес в сети вручную. То, что у нас есть, - это всего лишь цикл while, где мы устанавливаем последний номер в адресе, делаем тихий одиночный пинг по адресу, проверяем, была ли команда успешной или нет (и если она преуспела, то узел явно вверх) и printf
заявление. Быстро и грязно, мне потребовалось около 10 минут, чтобы написать его, но время выполнения может быть немного медленным.
#!/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
Я изначально опубликовал этот ответ в августе 2015 года. С тех пор я узнал немного больше о сценариях оболочки, и однажды я увидел этот скрипт, я подумал, что было бы неплохо вернуться к этому ответу, чтобы добавить несколько улучшения. Вот несколько идей:
Скрипт явно медленный, и ping
ожидает ответа от хоста. По умолчанию ping
для двух RTT, которые могут различаться в зависимости от того, насколько перегружена ваша сеть, и насколько я понимаю TCP-протокол удваивает время ожидания каждый раз (по крайней мере, согласно Это ). Таким образом, мы могли бы заставить ping
тайм-аут с флагом -w 1
. Поскольку у нас 256 адресов, и мы принимаем 1 секунду для каждого адреса, сценарий займет около 256/60 = 4,27 минуты.
Выполнение команды, а затем захват ее статуса выхода $?
не было действительно необходимым. if ... then;...fi
может работать с командами напрямую. Другими словами, этого достаточно:
if ping -w 1 -q -c 1 192.168.0.$NUM > /dev/null ;
then
<some other code here>
fi
Команда printf
может быть переписана так:
printf "IP %s is up\n" 192.168.0."$NUM"
Это больше похоже на стилистическое изменение, но оно согласуется с тем, как printf
работает и выглядит на многих других языках с цитированием переменной "$NUM"
. Цитирование здесь не обязательно - поскольку мы имеем дело только с числами, нам не нужно ожидать разбиения слов из-за наличия пробелов в переменной.
Значительно лучшее улучшение производительности может быть достигнуто, если мы создадим несколько фоновых процессов. Скрипт, приведенный ниже, делает именно это. Я ставлю ping
и printf
в функцию, pingf
(да, банальное имя, я знаю). Теперь есть еще одна функция main
, которая выполняет цикл и вызов 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
Насколько это лучше работает? Неплохо, на самом деле, занимает несколько секунд. Р>
$ 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
fping
- отличный инструмент для сканирования нескольких хостов в сети через ICMP. Если он не установлен, его можно установить с помощью:
sudo apt-get install fping
fping
отправляет ICMP ECHO_REQUEST пакеты и помещает хост как Up, если он получает ECHO_RESPONSE с хоста.
Например, чтобы сканировать хосты подсети 192.168.1.0/24
, вы можете сделать:
fping -g 192.168.1.0/24
Для определенного количества хостов, например. от 192.168.1.15
до 192.168.1.140
:
fping -g 192.168.1.15 192.168.1.140
fping
сильно настраивается, например. сколько пакетов будет отправлено, время ожидания ответа, формат вывода и т. д.
Проверьте man fping
, чтобы получить больше информации.