Как я могу перечислить все 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

Отлично спасибо. Возвращает именно тот формат, который мне нужен.
— Кристофер Гвильямс

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


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

2

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

nmap -sn 192.168.1.1-254/24 | egrep "scan report" | awk '{print $5}'

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.