Поиск других компьютеров в сети через командную строку


30

У меня есть несколько компьютеров Mac в моей домашней сети, и оболочка имеет доступ только к одному из них извне. Как я могу определить IP-адрес других машин?

Ответы:


39

Попробуйте arp -aпосмотреть текущую таблицу arp вашего компьютера. Он покажет только те IP-адреса, с которыми взаимодействовал ваш компьютер. Вывод так (немного скрыт, чтобы скрыть MAC-адреса в моей сети):

$ arp -a
? (10.1.168.1) at xx:xx:9e:82:ab:f6 on en1 ifscope [ethernet]
? (10.1.168.16) at xx:xx:29:d3:17:8 on en1 ifscope [ethernet]
? (10.1.168.115) at xx:xx:2:4f:76:14 on en1 ifscope [ethernet]
? (10.1.168.131) at xx:xx:6b:d0:36:a5 on en1 ifscope [ethernet]
? (10.1.168.134) at (incomplete) on en1 ifscope [ethernet]
? (10.1.168.137) at xx:xx:65:46:cd:b8 on en1 ifscope [ethernet]
? (10.1.168.255) at ff:ff:ff:ff:ff:ff on en1 ifscope [ethernet]
? (192.168.4.255) at ff:ff:ff:ff:ff:ff on vmnet8 ifscope [ethernet]
? (192.168.110.255) at (incomplete) on vmnet1 ifscope [ethernet]

Если у вас нет дополнительной информации о том, какой компьютер какой, вы можете получить немного больше информации, определив производителей сетевых карт с помощью поиска MAC-адреса .


12
Извините, что прошло почти 4 года, чтобы пометить это как правильное.
Джон Хаддад

Что означает « arp -aпокажет только те IP-адреса, с которыми взаимодействовал ваш компьютер». ? Должен ли я сначала пропинговать широковещательную рассылку (192.168.110.255) и получить ответ от каждого устройства, а затем использовать arp для получения полного списка, поскольку я только что взаимодействовал / пинговал все устройства?
Weishi Zeng

10

Предполагая, что все другие машины находятся в том же широковещательном домене, что и тот, к которому у вас есть доступ, пинг широковещательного адреса часто будет достаточным. Он не найдет машины, которые спят, ни те, которые настроены не отвечать на пинги, ни те, которые будут отвечать на пинги, но не широковещательные.

% ifconfig -a | grep broadcast
        inet 192.168.1.241 netmask 0xffffff00 broadcast 192.168.1.255
% ping -i 5 -c 2 192.168.1.255
PING 192.168.1.255 (192.168.1.255): 56 data bytes
64 bytes from 192.168.1.241: icmp_seq=0 ttl=64 time=0.393 ms
64 bytes from 192.168.1.254: icmp_seq=0 ttl=255 time=2.511 ms (DUP!)
64 bytes from 192.168.1.65: icmp_seq=0 ttl=64 time=5.810 ms (DUP!)
64 bytes from 192.168.1.255: icmp_seq=0 ttl=64 time=7.886 ms (DUP!)
64 bytes from 192.168.1.241: icmp_seq=1 ttl=64 time=0.312 ms

--- 192.168.1.255 ping statistics ---
2 packets transmitted, 2 packets received, +3 duplicates, 0% packet loss
round-trip min/avg/max/stddev = 0.312/3.382/7.886/3.010 ms

Первый и последний ответ почти всегда будет вашей локальной машиной. Эти (DUP!)ответы от других машин (хотя этот пример показывает какую - то машину оказывающей самого широковещательного адрес, который не очень полезно).

Вы также можете попробовать широковещательный адрес «все единицы»:

% ping -i 5 -c 2 255.255.255.255
PING 255.255.255.255 (255.255.255.255): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.392 ms
64 bytes from 192.168.1.254: icmp_seq=0 ttl=255 time=3.053 ms (DUP!)
64 bytes from 192.168.1.65: icmp_seq=0 ttl=64 time=8.685 ms (DUP!)
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.319 ms

--- 255.255.255.255 ping statistics ---
2 packets transmitted, 2 packets received, +2 duplicates, 0% packet loss
round-trip min/avg/max/stddev = 0.319/3.112/8.685/3.401 ms

Этот пример показывает меньшую хитрость. Все (DUP!)это другие машины, и локальная машина легко идентифицируется как 127.0.0.1.


8

Все ваши компьютеры Mac имеют имена хостов, поэтому вам не нужно знать IP-адреса. Вместо этого вы просто будете использовать имя хоста.

Имена хостов основаны на любом имени, которое вы дали компьютеру. Поэтому, если компьютер называется «Jon's Mac», имя хоста, которое вы будете использовать, будет выглядеть как «jons-mac.local».

$ ssh jons-mac.local

Если вы еще не знаете имен хостов своих компьютеров, вы можете узнать имена хостов компьютера в настройках общего доступа на этом компьютере или узнать имена хостов других компьютеров в сети с помощью команды dns-sd. Эта команда использует Bonjour, чтобы позволить вам просматривать сетевые сервисы; вы найдете только компьютеры, которые фактически рекламируют какой-либо сетевой сервис (который, по большому счету, является единственным, о котором вы заботитесь).

Если вы хотите подключиться к некоторому компьютеру с поддержкой ssh, вы можете найти доступные компьютеры, используя:

dns-sd -B _ssh._tcp .

В общем, вы можете искать хосты, предоставляющие определенные сервисы, используя названия сервисов: http://www.dns-sd.org/ServiceTypes.html

Протокол Bonjour также предоставляет возможность просмотра всех служб, а не только определенных. Вы можете сделать это, просмотрев специальную услугу_services._dns-sd._udp

dns-sd -B _services._dns-sd._udp .

Вопрос заключается в том, чтобы найти другие компьютеры в сети из командной строки, но вы также можете просматривать рекламируемые сервисы dns-sd в графическом интерфейсе. Например, Terminal.app> Новое удаленное соединение ... открывает окно, в котором отображаются рекламируемые службы ssh, sftp, ftp и telnet.


Как быстро можно ожидать выполнения этой команды dns-sd -B _ssh._tcp .?
AJP

1
@AJP Если рекламируются какие-либо службы ssh, они должны немедленно начать возвращать результаты. Но если под «финишем» вы подразумеваете выход, он не выходит; команда запускает долгоживущий запрос и непрерывно выводит изменения, когда службы появляются и исчезают из сети, пока вы не уничтожите их.
bames53

7

Вы можете попробовать использовать его dns-sdдля выполнения запросов Bonjour в локальной сети.


3
Мне нравится, что этот ответ специфичен для OS X и подключается к Bonjour, чтобы избежать получения дополнительных сведений о сети, которые меня не волнуют (в контексте этого вопроса). Конкретная команда, которая работала для моих нужд, была:dns-sd -B _ssh._tcp .
stevenhaddox

6

Может быть, это немного излишне, но вы могли бы использовать Nmap


1
Хотя это может дать ответ на вопрос, было бы лучше, если бы вы могли объяснить, почему это так.
DavidPostill

4

Быстрый CLI один вкладыш для пошагового выполнения / 24 подсети пингует каждый IP-адрес. Быстро и немного грязно, но это работает.

for (( x=1; x <= 254; x++ )); do ping -c 3 192.168.0.$x; done

Объяснение: Чтобы изменить диапазон, измените x = 1 на x = 130, или как хотите, с 254 до конца, скажем, 135.

for (( x=130; x <= 135; x++ ));

ping -c 3 отправляет три пинга. Чтобы изменить количество пингов, измените 3 на другое, а для изменения диапазона адресов измените 192.168.0 на другое.

do ping -c 30 10.10.0.$x;

1
Вы можете просто использовать fping, чтобы сделать это:fping -ag 172.16.0.0/16
ıɾuǝʞ

Это совсем не быстро, для меня ...
Макс Уильямс

Это быстрое и грязное решение. Как, например, его быстро реализовать при отсутствии правильных инструментов, таких как nmap, и он не так эффективен, как правильные инструменты, такие как nmap. Проверка связи с хостами может занять некоторое время, когда они не отвечают, и, поскольку это не многопоточный режим, потребуется некоторое время, когда хост не отвечает. С другой стороны, ничего кроме bash не требуется.
Quinnr

2

Если вы знаете имена других компьютеров в локальной сети, самый простой способ - проверить их:

$ ping foobar

Pinging foobar.lan [192.168.0.25] with 32 bytes of data:

Reply from 192.168.0.25: bytes=32 time<1ms TTL=64
Reply from 192.168.0.25: bytes=32 time<1ms TTL=64

Это может зависеть от вашего локального маршрутизатора или DHCP-сервера. Если пустое имя хоста не работает, попробуйте добавить .local (т. Е. Ping hostname.local ).

Очевидно, что это плохо работает для больших локальных сетей или людей с плохой памятью.


1

Если вы используете Mac (при условии 10,5 или более), просто включите VNC для доступа к рабочему столу и используйте Flame.app.

http://husk.org/apps/flame/

Это действительно хорошая маленькая утилита, которая дает вам именно то, что вам нужно, очень быстро. Единственное, что вам придется идти дальше, чем SSH.


1

Для Windows:

1) Запись: для / L% I в (1,1254) DO ping -w 30 -n 1 168.29.0.% I Это будет пинговать все адреса в вашей локальной сети

2) Затем напишите: arp -a Это даст вам все адреса, которые ответили


Конечно, это зависит от вашего локального сетевого адреса. В моем случае это 168.29.0.xxx. Ваш может быть что-то вроде 192.168.0.xxx
Чавдар

1
Ваш ответ основан на Windows, в то время как ОП заявил, что он использует Mac. Можете ли вы отредактировать свой вопрос, чтобы принять это во внимание или указать, будет ли ваше решение работать на Mac.
Мэтью Уильямс

У каждого пользователя MAC есть операционная система Windows, сидящая без дела ... Вы не можете жить без нее ...: D
user2173353
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.