Manera fácil de obtener la dirección IP del nombre de host utilizando un shell de Unix

12

¿Cuál es la forma más fácil de obtener la dirección IP de un nombre de host?

Estaba pensando en probar pingay analizarlo desde la salida. Sin embargo, eso no parece muy agradable y probablemente no funcionará de la misma manera en todos los sistemas.

Busqué un poco y encontré soluciones nslookup, pero eso no funciona para los nombres de host en /etc/hosts.

Albert
fuente
Todavía me pregunto un poco por qué los shells de Unix no se consideran lenguajes de programación ...
Albert
Debido a que Shell tradicionalmente se ve como scripting, no como programación;)
Tino

Respuestas:

5

Puede hacer esto con llamadas al sistema estándar. Aquí hay un ejemplo en 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);

produce la salida:

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

(En la línea de comandos, el mismo guión se puede escribir como: perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)')

Puede hacer esto de manera similar en otros idiomas: consulte la página del manual para ver las llamadas al sistema, man -s3 gethostbynameetc.

Éter
fuente
Genial, eso 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
Muy extraño que esta respuesta sea un código de programa ... :) Parece casi una respuesta de Stackoverflow. Realmente no pertenece a Serverfault. Pero aceptaré la respuesta de todos modos.
Albert
@ Albert: para ser justos: 1. la pregunta se publicó en SO originalmente y se migró a SF, y 2. el tipo de datos que está buscando debe analizarse con algo ; algunas personas consideran que Perl es una mejor forma de script de shell: D
Ether
@Ether sed -e '/some people consider Perl a better form/s/better/worse/'SCNR
Tino
11

host <hostname>

Ex:

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

Editar

En Linux, (y algunas variantes de OS X, al menos), es posible que pueda usar resolveip, que es parte del paquete del 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
fuente
Además no funciona. (Para hosts en /etc/hosts.) Inténtalo host localhost.
Albert
serv ~ $ host localhost \n localhost has address 127.0.0.1
Hm, bueno, no aquí. Tengo curiosidad por qué eso funciona para ti. O por qué no lo hace para mí.
Albert
2
Vea mi edición, puede intentarlo resolveip.
Hm, resolveipno está instalado por defecto en mi Debian.
Albert
9

Esta publicación antigua parece tener muchas soluciones creativas.

Si necesito asegurarme de que también /etc/hostsse accede, tiendo a usar

getent hosts somehost.com

Esto funciona, al menos si `/etc/nsswitch.conf 'se ha configurado para usar archivos (como suele ser).

Janne Pikkarainen
fuente
Agradable, y también funciona para IPv6.
Tino
¡Y no necesita instalar syslinux!
Claudiu
Es interesante que para algunas IPs no devuelva nada mientras ahostsque devuelve información de varias líneas.
akostadinov
7

Para IPv4, hay un programa estándar que funciona de forma inmediata utilizando el solucionador que incluye / etc / hosts:

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

Forma parte de Debian, instálelo con:

apt-get install syslinux

Para otros protocolos que no sean IPv4 (como IPv6), actualmente no conozco una herramienta similar. Actualización: Debido a esto, acabo de escribir una pequeña herramienta que también es capaz de resolver IPv6:

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

Está pensado para un uso de shell rápido y sucio, gethostippero también permite IPv6:

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

También se puede usar de forma interactiva, por ejemplo:

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

HTH

Tino
fuente
Vine aquí para dar esta respuesta, te voté en su lugar.
No ahora
3

Bueno, mi solución actual:

ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"
Albert
fuente
esto no solo da la IP: PING www.l.google.com (72.14.234.104): 56 bytes de datos
Federico klez Culloca
Sí, parece que se sedcomporta ligeramente diferente en cada sistema. :) Que molesto. Lo cambié un poco, creo que debería funcionar en todas partes ahora.
Albert
3

¿Por qué no dig +short hostname?

(consulta DNS)

gWaldo
fuente
No tiene /etc/hostsen cuenta.
Janne Pikkarainen
Se supone que DNS es una fuente definitiva para la resolución de nombres, y si usa el archivo host para anular, está bien. Pero eso es una anulación, no definitiva ...
gWaldo
Lo sé, pero la pregunta original quería / etc / hosts :)
Janne Pikkarainen
bastante seguro; mi comprensión de lectura falla ...
gWaldo 01 de
0

En algunos Unices, lo siguiente funcionará:

arp <hostname>

Por ejemplo, en Mac OS X, obtengo esto:

arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry
ennuikiller
fuente
Bueno, encuentra la entrada pero solo enumera su MAC, no su IP. :)
Albert
Ah, arp -n hostnamemuestra la IP.
Albert
Solo que de esta manera no funciona para servidores fuera de la red. : P
Albert
0

Usar pingno es tan malo ya que generalmente no tienes dependencias fuertes.

Aquí está la función que utilicé en los sistemas Linux:

getip () { ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' ; }
Bruno BEAUFILS
fuente
-1
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'
  • Nmap obtiene de su subred (192.168.1.0 o lo que sea) las direcciones
  • con grep obtenga solo la línea del nombre de host que está buscando
  • Con sed, obtenga solo la dirección IP dentro de los paréntesis
Philippe Gachoud
fuente
2
Un poco más de información sobre los diversos interruptores y por qué se usaría agregaría a su respuesta
Dave M
Hay al menos cuatro razones diferentes por las que esta respuesta no va a funcionar. Hace suposiciones sobre el rango de direcciones IP dentro de las cuales se encontrará la respuesta. Es ineficiente debido a que produce mucho más tráfico de red del necesario. Solo funciona para direcciones IP que responden a sondeos. Se supone que el DNS inverso contiene exactamente las mismas asignaciones que el DNS directo.
Kasperd