Как я могу перечислить все IP-адреса в подключенной сети, предпочтительно через Терминал?

219

Используя Ubuntu 10.10, мне было интересно, есть ли команда командной строки, которая может перечислить все IP-адреса устройств, подключенных к сети?

Я хотел бы использовать это, например, чтобы перечислить все компьютеры, подключенные к моей домашней сети. В идеале это должна быть командная строка, так как я буду запускать ее из C ++.

Есть идеи?

Кристофер Гвильямс
источник

Ответы:

242

Проверьте команду 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
Linker3000
источник
Отлично спасибо. Возвращает именно тот формат, который мне нужен.
Кристофер Гвильямс
1
Отлично работает и на OSX! Установлен с Brew, и интерфейс был en0, а не eth0, но прекрасно работает.
nthonygreen
6
Если вы подключены к сети, используя Wi-Fi wlan0вместо eth0.
Нил
3
Можете ли вы получить это, чтобы перечислить имена хостов, а также IP-адреса?
user1527227
2
Стоит отметить, что при этом не используется кэш ARP: он выполняет фактическое сканирование. В отличие от большинства сканирований nmap, это не может пересечь границы уровня 3, что обычно является тем, что вы хотите в этом сценарии. (Другими словами, он ограничен вашей подсетью.)
Zenexer
111

Используйте nmap. пример: nmap -sn 10.10.10.0/24кеш arp будет сообщать вам только те, с которыми вы пытались связаться недавно.

Кит
источник
2
такое 10.10.10.0 мой данный IP? Что такое 24 в этом случае? Благодарю.
Колонель
4
@kolonel Это всего лишь пример. Вы должны заменить его своей сетью. 24 - это «косая нотация» маски подсети. Это значит использовать 24 бита слева. Это эквивалентно 255.255.255.0.
Кит
2
@ Знаете ли вы, как я узнаю свой сетевой адрес для использования? Или это просто мой IP с 0/24 в конце?
TMH
20

В Windows это будет " arp -a" Я считаю, что эквивалент в Linux будет " arp -e".

Эту информацию можно найти на странице man для arp:

arp with no mode specifier will print the current content of the table.
-e : Use default Linux style output format (with fixed columns).
Дэвид
источник
Похоже, что это работает (возможно, мне нужно сыграть, так как я нахожусь в общедоступной сети, поэтому кажется, что в нем перечислены только все серверы в сети.
Кристофер Гвильямс
Если я нахожусь в домашней сети, это просто перечислит устройства, связанные с моим маршрутизатором? Спасибо!
Кристофер Гвильямс
1
Эта команда будет перечислять только устройства в текущем arp-кэше хостов, и это будут только те устройства, с которыми хост недавно связался.
Linker3000
Оба работают в Linux, но arp -aотображают (все) хосты в альтернативном (BSD) стиле. Simpy running arpделает то же самое, что и запуск, потому arp -eчто это по умолчанию.
Simplegamer
15

Если ваша сеть есть 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
Андерс Ларссон
источник
Привет, Андерс ... Сеть пользователя может быть не 192.168.0.0/24; Я сделал заметку. Форматирование сайта не понравилось "#", поэтому форматирование фрагмента кода затормозилось: при вводе кода используйте кнопки-цитаты или предварительно отформатированные текстовые кнопки и просмотрите свой ответ на предмет правильного форматирования, прежде чем отправлять его, как возврат каретки, вкладки, и места, возможно, были удалены.
Невин Уильямс
Кроме того, при предоставлении сценария, который необходимо поместить в файл и сделать исполняемым, а не просто вырезать и вставить, вероятно, лучше указать это; для некоторых может быть неочевидным, что нужно для реализации вашего решения.
Невин Уильямс
12
Технически это вернет только хосты, которые отвечают на ping. Могут быть хосты, которые подключены, но не отвечают на эхо-запросы ICMP. Также можно транслировать один пакет на всю сеть, указав широковещательный адрес, который является последним адресом в IP-сети: ping -c 1 -W 1 192.168.0.255 выполнит то же самое, что и цикл for.
Невин Уильямс
@NevinWilliams (требуется -b, удалено -W, чтобы больше ждать) ping -b -c 1 192.168.0.255результат "1 переданных пакетов, 0 полученных, 100% потерь пакетов, время 0 мс"
Aquarius Power
13

Попробуйте установить 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каждую машину в сети, но, по моему опыту, она не всегда работает правильно.

Samadi
источник
На самом деле, ни один из ответов не всегда будет работать правильно. IP не был разработан с учетом этого требования, и существуют такие вещи, как частные VLAN, которые делают невозможным поиск других хостов в той же локальной сети.
Рон Мопин
2

Придумал следующее на нексусе, используя не tmuxкак arp-scanв репозитории, а с nmapпредустановленной, отображает только ip адреса:

nmap -sn 192.168.1.1-254/24 | egrep "scan report" | awk '{print $5}'
zentek
источник
1

Для более компактного списка подключенных устройств:

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будет отображаться только то, которое было подключено к маршрутизатору последним

Александр Малахов
источник
Если у вас есть один и тот же ответ на два вопроса, возможно, стоит подумать о том, чтобы пометить вопросы как дублирующие, а не публиковать повторяющиеся ответы. Таким образом, знаниями можно поделиться, когда похожие вопросы связаны друг с другом.
Мокубай
1
@Mokubai Вы правы, я добавил комментарий к ОП. Это показывает интересную проблему. Быстрый поиск обнаружил 6 дубликатов (это Q и 5 ссылок) через 4 сетевых сайтов (SU, Ask Ubuntu, SF, Unix). Конечно, есть гораздо больше! Как мне справиться с этим? В идеале каждый из этих 6 постов должен содержать ссылку на 5 других. Добавление всех этих ссылок вручную явно не масштабируется. Итак, на данный момент я ссылаюсь на этот пост (большинство проголосовало). Другая проблема заключается в том, что невозможно пометить Q в AskUbuntu как копию Q в SU. Хм ... Наверное, это уже обсуждалось на мета?
Александр Малахов
не работает для меня на Centos 7, просто перечисляет все возможные IP-адреса в сети без имен. У меня сработал arp-scan.
Джефф
0

Разрабатывая ответ Андерса Ларрсона -

#!/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
Матье КАРОФФ
источник