Localizando outros computadores na rede pela linha de comando

30

Eu tenho um punhado de Macs na minha rede doméstica e acesso de shell a apenas um deles de fora. Como posso descobrir qual é o endereço IP das outras máquinas?

Jon Haddad
fonte

Respostas:

39

Tente arp -aver a tabela arp atual do seu computador. Ele mostrará apenas os endereços IP com os quais seu computador interagiu. Saída como esta (obscureceu um pouco para esconder endereços MAC na minha rede):

$ 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]

Se você não tiver mais informações sobre qual computador é, poderá obter um pouco mais de informações, identificando os fabricantes das placas de rede através da pesquisa de endereço MAC .

Doug Harris
fonte
12
Desculpe, demorou quase 4 anos para marcar isso como correto.
Jon Haddad
O que significa " arp -amostrará apenas os endereços IP com os quais seu computador interagiu". ? Devo executar ping na transmissão (192.168.110.255) primeiro e obter resposta de todos os dispositivos e, em seguida, usar o arp para obter uma lista completa, pois acabei de interagir / executar ping em todo o dispositivo?
Weishi Zeng
10

Supondo que todas as outras máquinas estejam no mesmo domínio de difusão ao qual você tem acesso, executar ping no endereço de difusão geralmente será suficiente. Ele não encontrará máquinas que estão adormecidas, nem aquelas configuradas para não responderem a pings, nem aquelas que responderão a pings, mas não para transmitir pings.

% 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

A primeira e a última resposta quase sempre serão sua máquina local. As (DUP!)respostas são de outras máquinas (embora este exemplo também mostre alguma máquina respondendo com o próprio endereço de broadcast, o que não é muito útil).

Você também pode tentar o endereço de transmissão completo:

% 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

Este exemplo mostra menos sujeira. Todas as (DUP!)outras são máquinas e a máquina local é facilmente identificada como 127.0.0.1.

Chris Johnsen
fonte
8

Todos os seus Macs têm nomes de host, portanto você não precisa saber os endereços IP. Em vez disso, você apenas usará o nome do host.

Os nomes de host são baseados no nome que você deu ao computador. Portanto, se o computador tiver o nome "Jon's Mac", o nome do host que você usará será algo como "jons-mac.local".

$ ssh jons-mac.local

Se você ainda não conhece os nomes de host de seus computadores, pode descobrir os nomes de host de um computador nas preferências de compartilhamento desse computador ou pode descobrir os nomes de host de outros computadores na rede usando o comando dns-sd. Este comando usa o Bonjour para permitir a navegação nos serviços de rede; você encontrará apenas computadores que estão realmente anunciando algum serviço de rede (que, em geral, são os únicos que lhe interessam).

Se você deseja se conectar a algum computador que fornece ssh, poderá encontrar os computadores disponíveis usando:

dns-sd -B _ssh._tcp .

Em geral, você pode procurar hosts que fornecem serviços específicos usando os nomes de serviço: http://www.dns-sd.org/ServiceTypes.html

O protocolo Bonjour também oferece a capacidade de procurar todos os serviços, não apenas os específicos. Você pode fazer isso navegando pelo serviço especial_services._dns-sd._udp

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

A pergunta é sobre encontrar outros computadores na rede a partir da linha de comando, mas você também pode procurar serviços anunciados por DNS-SD na GUI. Por exemplo, Terminal.app> Nova conexão remota ... abre uma janela que mostra os serviços anunciados de ssh, sftp, ftp e telnet.

bames53
fonte
Quão rápido você pode esperar que esse comando dns-sd -B _ssh._tcp .seja executado?
AJP
1
@AJP Se ​​houver algum serviço ssh anunciado, ele deverá começar a retornar resultados imediatamente. Mas se por 'terminar' você quer dizer sair, ele não sai; o comando executa uma consulta de longa duração e gera alterações continuamente à medida que os serviços aparecem e desaparecem da rede até que você a mate.
bames53
7

Você pode tentar usar dns-sdpara realizar consultas Bonjour na LAN.

Ignacio Vazquez-Abrams
fonte
3
Eu amo que essa resposta seja específica do OS X e se ligue ao bonjour para evitar obter detalhes adicionais da rede com os quais eu não me importaria (no contexto desta pergunta). O comando específico que trabalhou para as minhas necessidades foi:dns-sd -B _ssh._tcp .
stevenhaddox
6

Talvez seja um pouco exagerado, mas você poderia usar o nmap

Wagnarock
fonte
1
Embora isso possa responder à pergunta, seria uma resposta melhor se você pudesse fornecer alguma explicação para isso.
DavidPostill
4

Um liner rápido da CLI para percorrer a sub-rede / 24 faz ping em cada endereço IP. Rápido e meio sujo, mas funciona.

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

Explicação: Para alterar o intervalo, altere x = 1 para x = 130, ou o que você deseja iniciar, e 254 para o final, por exemplo, 135.

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

ping -c 3 é enviado três pings. Para alterar o número de pings, altere o 3 para outra coisa e para alterar o intervalo de endereços, altere o 192.168.0 para outra.

do ping -c 30 10.10.0.$x;
quinnr
fonte
1
você poderia simplesmente usar fping para fazer isso:fping -ag 172.16.0.0/16
ıɾuǝʞ
Isto é tudo menos rápida, para mim ...
Max Williams
É uma solução rápida e suja. Por exemplo, é rápido de implementar na ausência das ferramentas corretas, como o nmap, e não é tão eficiente quanto as ferramentas corretas, como o nmap. Os hosts ping podem demorar um pouco quando não respondem, e como isso não é multithread, levará um tempo quando um host não responder. No lado positivo, não requer nada além do bash.
quinnr
2

Se você souber o nome dos outros computadores na LAN, a maneira mais simples é fazer o ping deles:

$ 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

Isso pode depender do seu roteador local ou servidor DHCP. Se o nome do host simples não funcionar, tente anexar .local (por exemplo, ping hostname.local ).

Obviamente, isso não funciona bem para LANs grandes ou pessoas com pouca memória.

charlatão quixote
fonte
1

Se você estiver usando Macs (assumindo 10.5 ou superior), ative o VNC para acesso à área de trabalho e use o Flame.app.

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

É um pequeno utilitário muito bom que fornece exatamente o que você precisa, rapidamente. A única coisa é que você teria que ir além do SSH.

tylerm
fonte
1

Para Windows:

1) Escreva: para / L% I em (1.154) DO ping -w 30 -n 1 168.29.0.% I Isso fará ping em todos os endereços da sua rede local

2) Em seguida, escreva: arp -a Isso fornecerá todos os endereços que responderam

Chavdar
fonte
Claro que depende do seu endereço de rede local. No meu caso, é 168.29.0.xxx. O seu pode ser algo como 192.168.0.xxx
Chavdar
1
Sua resposta é baseada no Windows enquanto o OP afirmou que ele está usando um Mac. Você pode editar sua pergunta para levar isso em consideração ou indicar se sua solução funcionaria em um Mac.
Matthew Williams
Cada usuário MAC tem um SO Windows sentados ao redor ... você não pode viver sem ela ...: D
user2173353