Maneira fácil de obter o endereço IP do nome do host usando um shell Unix

12

Qual é a maneira mais fácil de obter o endereço IP de um nome de host?

Eu estava pensando em tentar um pinge analisá-lo a partir da saída. No entanto, isso não parece muito bom e provavelmente não funcionará da mesma maneira em todos os sistemas.

Pesquisei um pouco e encontrei soluções com nslookup, mas isso não funciona para nomes de host no /etc/hosts.

Albert
fonte
Eu ainda me pergunto um pouco por que os shell do Unix não são considerados como linguagens de programação ...
Albert
Porque shell tradicionalmente é visto como scripting, não de programação;)
Tino

Respostas:

5

Você pode fazer isso com chamadas de sistema padrão. Aqui está um exemplo no Perl:

use strict; use warnings;
use Socket;
use Data::Dumper;

my @addresses = gethostbyname('google.com');
my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses];
print Dumper(\@ips);

produz a saída:

$VAR1 = [
          '74.125.127.104',
          '74.125.127.103',
          '74.125.127.105',
          '74.125.127.106',
          '74.125.127.147',
          '74.125.127.99'
        ];

(Na linha de comando, o mesmo script pode ser escrito como perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)':)

Você pode fazer isso de maneira semelhante em outros idiomas - consulte a página de manual das chamadas do sistema em man -s3 gethostbynameetc.

Éter
fonte
Legal, isso funciona. Esp., perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'.
Albert
Muito estranho que esta resposta seja algum código de programa ... :) Parece quase uma resposta do Stackoverflow. Realmente não pertence ao Serverfault. Mas eu aceito a resposta de qualquer maneira.
Albert
@ Albert: bom ser justo: 1. a pergunta foi postada originalmente no SO e migrada para o SF, e 2. o tipo de dados que você está procurando precisa ser analisado com algo ; algumas pessoas consideram Perl uma melhor forma de shell script: D
Éter
@Ether sed -e '/some people consider Perl a better form/s/better/worse/'SCNR
Tino 30 /
11

host <hostname>

Ex:

serv ~ $ host stackoverflow.com
stackoverflow.com has address 69.59.196.211

Editar

No Linux (e algumas variantes do OS X, pelo menos), você pode usar o resolveipque faz parte do pacote do servidor MySQL:

/etc/hosts:
 ...
 127.0.0.1     localhost localhost.localdomain foo
 ...

serv ~ $ resolveip foo
IP address of foo is 127.0.0.1
Âmbar
fonte
Também não funciona. (Para hosts em /etc/hosts.) Tente host localhost.
Albert
serv ~ $ host localhost \n localhost has address 127.0.0.1
Hum, bem, não aqui. Estou curioso para saber por que isso funciona para você. Ou por que não faz para mim.
Albert
2
Veja minha edição - você pode tentar resolveip.
Hum, resolveipnão está instalado por padrão no meu Debian.
Albert
9

Este post antigo parece ter muitas soluções criativas.

Se eu precisar garantir que também /etc/hostsseja acessado, costumo usar

getent hosts somehost.com

Isso funciona, pelo menos se o `/etc/nsswitch.conf 'tiver sido configurado para usar arquivos (como geralmente é).

Janne Pikkarainen
fonte
Bom, e funciona para IPv6 também.
Tino
E não precisa instalar o syslinux!
Claudiu 21/03
Interessante que, para alguns IPs, ele não retorna nada enquanto ahostsretorna informações de várias linhas.
akostadinov
7

Para o IPv4, existe um programa padrão que funciona imediatamente usando o resolvedor, incluindo / etc / hosts:

host="localhost"
ip="`gethostip -d "$host"`"

Faz parte do Debian, instale-o com:

apt-get install syslinux

Para outros protocolos além do IPv4 (como o IPv6), atualmente não conheço uma ferramenta semelhante. Atualização: Por causa disso, acabei de escrever uma pequena ferramenta capaz de resolver o IPv6 também:

https://github.com/hilbix/misc/blob/master/src/ipof.c

Ele é pensado para um uso rápido e sujo do shell, como também gethostippermite o IPv6:

ip="`ipof -6 -- heise.de`"

Também pode ser usado interativamente, por exemplo:

ipof -a -d -x -v -h -

HTH

Tino
fonte
Vim aqui para dar esta resposta, com um voto positivo.
Não agora
3

Bem, minha solução atual:

ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"
Albert
fonte
isso não dá apenas o IP: PING www.l.google.com (72.14.234.104): 56 bytes de dados
Federico klez Culloca
Sim, parece que sedse comporta um pouco diferente em cada sistema. :) Que irritante. Mudei um pouco, acho que deve funcionar em qualquer lugar agora.
Albert
3

Por que não dig +short hostname?

(consulta DNS)

gWaldo
fonte
Não leva /etc/hostsem consideração.
Janne Pikkarainen
O DNS deve ser uma fonte definitiva para a Resolução de nomes e, se você usar o arquivo host para substituir, tudo bem. Mas isso é uma substituição, não é definitivo ...
gWaldo
Eu sei, mas a pergunta original queria / etc / hosts :)
Janne Pikkarainen
com certeza; minha compreensão de leitura falha ...
gWaldo 1/11/11
0

Em alguns Unices, o seguinte funcionará:

arp <hostname>

Por exemplo, no Mac OS X, recebo o seguinte:

arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry
ennuikiller
fonte
Bem, ele encontra a entrada, mas apenas lista seu MAC, não seu IP. :)
Albert
Ah, arp -n hostnamemostra o IP.
Albert
Somente dessa maneira não funciona para servidores fora da rede. : P
Albert
0

O uso pingnão é tão ruim, pois geralmente você não possui dependências fortes.

Aqui está a função que eu usei nos sistemas Linux:

getip () { ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' ; }
Bruno BEAUFILS
fonte
-1
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'
  • O Nmap obtém da sua sub-rede (192.168.1.0 ou o que for) os endereços
  • com grep obtém apenas a linha do nome do host que você está procurando
  • Com sed obtém apenas o endereço IP entre parênteses
Philippe Gachoud
fonte
2
Um pouco mais informações sobre os vários parâmetros e porque utilizado gostaria de acrescentar a sua resposta
Dave M
Há pelo menos quatro razões diferentes para que essa resposta não funcione. Você faz suposições sobre o intervalo de endereços IP no qual a resposta será encontrada. É ineficiente devido à produção de muito mais tráfego de rede do que o necessário. Funciona apenas para endereços IP que respondem a análises. Ele assume que o DNS reverso contém exatamente os mesmos mapeamentos que o DNS de encaminhamento.
kasperd