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

11

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

Eu estava pensando em experimentar um ping e analisá-lo na saída. No entanto, isso não parece muito legal 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 em /etc/hosts .

    
por Albert 14.08.2010 / 18:59

9 respostas

4

Você pode fazer isso com chamadas padrão do sistema. Aqui está um exemplo em 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 - veja a página man do chamadas do sistema em man -s3 gethostbyname etc.

    
por 14.08.2010 / 19:29
10

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 resolveip , que 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
    
por 14.08.2010 / 19:01
8

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

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

getent hosts somehost.com

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

    
por 01.11.2011 / 12:41
7

Para o IPv4, existe um programa padrão que funciona fora da caixa 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, eu acabei de escrever uma pequena ferramenta que é capaz de resolver o IPv6 também:

link

Acredita-se que o uso de um shell rápido e sujo, como gethostip , também permite o IPv6:

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

Também pode ser usado de forma interativa, por exemplo:

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

HTH

    
por 31.10.2011 / 22:33
3

Bem, minha solução atual:

ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*//g"
    
por 14.08.2010 / 19:11
2

Por que não dig +short hostname ?

(consulta DNS)

    
por 01.11.2011 / 14:34
0

Em alguns Unices, os seguintes itens funcionarão:

arp <hostname>

Por exemplo, no Mac OS X, recebo isso:

arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry
    
por 14.08.2010 / 19:12
0

Usar ping não é tão ruim, já que você geralmente não tem dependências strongs.

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

getip () { ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' ; }
    
por 22.12.2017 / 11:16
-1
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*//p'
  • O Nmap obtém da sua sub-rede (192.168.1.0 ou qualquer outro) os endereços
  • com o grep obtém apenas a linha do nome do host que você está procurando
  • Com sed obter apenas o endereço IP dentro dos parênteses
por 14.08.2015 / 17:10