Вопрос или проблема
Используя командную строку Ubuntu 10.10, как я могу перечислить все IP-адреса, подключенные к моей домашней сети?
Идеально, чтобы это была команда CLI, так как я буду запускать ее из C++.
Попробуйте команду arp-scan – вам, вероятно, придется ее установить, например:
sudo apt-get install arp-scan
http://manpages.ubuntu.com/manpages/hardy/man1/arp-scan.1.html
И для более детальной информации:
sudo arp-scan --interface=eth0 --localnet
Где eth0 – это ваше устройство. Вы можете найти ваше устройство с помощью:
ifconfig
Используйте nmap. пример: nmap -sn 10.10.10.0/24
Кэш arp покажет только те, с которыми вы недавно пытались связаться.
В Windows это будет arp -a
, эквивалентом этого в Linux будет arp -e
.
Из страницы man
для arp
:
arp без указания режима выведет текущее содержимое таблицы.
-e : Используйте формат вывода в стиле Linux по умолчанию (с фиксированными столбцами).
Если ваша сеть 192.168.0.0/24
, создайте исполняемый файл с следующим кодом; Измените 192.168.0
на вашу фактическую сеть.
#!/bin/bash
for ip in 192.168.0.{1..254}; do
ping -c 1 -W 1 $ip | grep "64 bytes" &
done
Попробуйте установить nmap
(sudo apt-get install nmap
) и введите nmap 192.168.1.0/24
, заменив 192.168.1
первыми тремя частями вашего IP-адреса (узнайте его с помощью ip addr
).
Вы также можете получить немного менее точную (по моему опыту) карту сети, запустив ping 192.168.1.255
(снова заменив 192.168.1
), что должно вызвать ping
для каждой машины в сети, но, по моему опыту, это не всегда работает правильно.
Для более компактного списка подключенных устройств:
nmap -sL 192.168.0.* | grep \(1
Объяснение.
nmap -sL 192.168.0.*
выведет все IP-адреса в подсети и отметит те, которые имеют имя:
Nmap scan report for 192.168.0.0
Nmap scan report for Dlink-Router.Dlink (192.168.0.1)
Nmap scan report for 192.168.0.2
...
Nmap scan report for android-473e80f183648322.Dlink (192.168.0.53)
...
Nmap scan report for 192.168.0.255
Так как все интересные записи начинаются со скобки (
и цифры 1
, мы фильтруем их с помощью | grep \(1
(для скобки необходим обратный слэш)
Особенность
Остерегайтесь, если у двух устройств одно и то же имя, nmap
покажет только то, которое было подключено к маршрутизатору последним
Получил следующий результат на Nexus, используя tmux
, так как arp-scan
нет в репозитории, но nmap
был предустановлен, отображает только IP-адреса:
nmap -sn 192.168.1.1-254/24 | egrep "scan report" | awk '{print $5}'
Этот ответ самостоятельно определяет подсеть, в отличие от других ответов, где вы должны её указать.
Скрипт использует arp -a
или ip -o -f inet addr show
, чтобы найти подсеть.
Я разработал скрипт, основываясь на ответах @anders-larsson и @mathieu-caroff. Я избегаю использования ‘nmap’, но скрипт легко подгонять под использование nmap.
По сути, $baseip
строится с использованием макросов замены bash во второй части скрипта, если параметр не предоставлен в командной строке. В противном случае он будет сканировать предоставленную подсеть (в формате: 192.1.5 без третьей точки последнего байта IP).
#!/bin/bash
function scan ()
{
for ip in $1.{1..254}; do
ping -c 1 -W 1 $ip &
done | sed -nE 's:^.* from ([0-9.]+).*time=(.*s)$:\1 (\2):p'
wait
}
if [ $1 ]; then
for baseip; do
scan $baseip
done
else
baseip=$(arp -a) && baseip=${baseip%%\)*} && baseip=${baseip##*\(}
if [ $baseip"" == "" ] ; then
baseip=$(ip -o -f inet addr show|grep "scope global") && baseip=${baseip##* inet} && baseip=${baseip%%/*}
fi
baseip=${baseip%.*}
scan $baseip
fi
Развивая ответ Андерса Ларссона –
#!/bin/bash
function scan ()
{
for ip in $1.{1..254}; do
ping -c 1 -W 1 $ip &
done | sed -nE 's:^.* from ([0-9.]+).*time=(.*s)$:\1 (\2):p'
}
if [ $1 ]; then
for baseip; do
scan $baseip
done
else
scan 192.168.1
fi
Вот еще одно решение в терминале:
nmap -sn 192.168.1.0/24
(если IP вашего маршрутизатора начинается с 192.168.1._ )
или
ip n
или
ip -r n
Это работает для моих целей.
#!/bin/bash
# Ex : write as ~/bin/netscan.sh; chmod +x ~/bin/netscan.sh; ~/bin/netscan.sh 192.168.1
# cat /sys/class/net/*/address ; cat /sys/class/net/$(ip route show default | awk '/default/ {print $5}')/address
scannet() { for IP in "${1}."{1..254}; do ping -c1 $IP | grep "64 bytes" & done; wait ;}
# wait for receive or time - sleep 6; : ; sleep 1 "
sleep 2 # for some sleepers
#
scan () { Devices=$(scannet "${1}" 2>/dev/null); echo "$Devices"; echo "# Done" ;}
if [[ $1 = '' ]]; then
output=$(ip route list exact default)
# ip route show default
echo "$output"
read null null default null dev null <<< "$output"
srcvalue=${null##*src } srcvalue=${srcvalue%% *}
value=${default%.*}
echo
echo "default = $dev $srcvalue $default '${value}.0/24'"
echo
echo "### Ex : netscan.sh $value ; netscan.sh 192.168.1 -"'[${1}].{1..254}'
echo "### ip route list exact default"
echo "### ip -resolve show"
echo "### ip -resolve neighb show {IP}"
echo "### sudo nmap -O -n '${value}.*' ###"
echo
echo "# Wait - ping -c1 ${value}"'.{1..254} :'
scan ${value}
echo
PresentIP=$(ip neighb show | grep "lladdr")
echo "# Net : $dev $srcvalue : ip neighb show :"
echo "$PresentIP"
exit
else
echo "### ping -c1 ${1}.{1..254}"
echo "### Ex : ip route list exact default ; ip -resolve neigh show ; sudo nmap -O ${1}. ###"
echo "# Wait - ping -c1 ${1}"'.{1..254} :'
scan ${1}
PresentIP=$(ip neighb show | grep "lladdr")
echo "# ip neighb show :"
echo "$PresentIP"
exit
fi
Пример: напишите как ~/bin/netscan.sh # netscan.sh 192.168.1
.
Ответ или решение
Для поиска всех IP-адресов, подключенных к домашней сети, используя командную строку Ubuntu 10.10, существует несколько подходов. Ниже описаны наиболее эффективные и распространенные способы решения этой задачи.
Теория
Основная задача заключается в определении всех активных устройств в локальной сети, что требует выполнения сетевого сканирования. Существует множество инструментов, которые могут помочь в этом, но наиболее распространенные — это nmap
и arp-scan
. Каждый из этих инструментов имеет свои сильные и слабые стороны, о которых стоит упомянуть.
nmap — это мощный инструмент для сканирования сети, который может обнаружить активные устройства, определить их IP и MAC-адреса, а также выяснить многие другие параметры. Он использует ICMP-запросы и запросы на открытие TCP/UDP-портов для идентификации устройств.
arp-scan — это более простой инструмент, который использует ARP-запросы для определения активных устройств в сети. Он хорош для быстрого и простого сканирования сети на уровне второго уровня модели OSI.
Пример
Установка инструментов
Для того чтобы использовать указанные инструменты, их необходимо сначала установить. Это можно сделать с помощью следующих команд:
sudo apt-get install nmap
sudo apt-get install arp-scan
Использование nmap
nmap
может быть использован для простого поиска всех устройств в сети:
nmap -sn 192.168.1.0/24
В этой команде 192.168.1.0/24
должно быть заменено на вашу конкретную IP-подсеть. Команда -sn
указывает nmap
на выполнение простого пинга без полного сканирования портов.
Использование arp-scan
arp-scan
предоставляет более быстрый метод для получения информации о всех устройствах в вашей сети:
sudo arp-scan --interface=eth0 --localnet
Здесь eth0
замените на имя вашего сетевого интерфейса, чтобы узнать его, выполните команду ifconfig
или ip addr
.
Применение
Для автоматизации процесса или интеграции его в вашу программу на C++, можно использовать либо системные вызовы для выполнения команд, либо взаимодействовать с сетью напрямую через API и библиотеки, такие как libpcap для C++, которые предоставляют функциональность для работы на более низком уровне сети.
Автоматизация через Bash скрипт
Для удобства можно написать скрипт, который будет выполнять перечисленные действия и выводить список доступных IP-адресов. Приведем пример:
#!/bin/bash
SUBNET="192.168.1"
for ip in $SUBNET.{1..254}; do
ping -c 1 -W 1 $ip | grep "64 bytes" &
done
wait
Этот скрипт выполняет пинг всех IP-адресов в указанной подсети и отображает только те, которые доступны.
Заключение
Выбор метода зависит от ваших целей: если требуется простота и быстрота — arp-scan
, если глубина анализа и дополнительные данные — nmap
. Однако нужно помнить, что оба метода имеют ограничения, зависящие от конфигурации сети и настроек оборудования (например, отключение ответов на ICMP-запросы).
Эти команды и методы могут быть легко интегрированы в вашу систему администрирования сети, обеспечивая оперативный мониторинг подключенных устройств. Они позволят вам не только получать актуальную информацию о подключенных устройствах, но и оперативно реагировать на изменения сети.