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.


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.


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

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).


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


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"

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)


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

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 '()' ; }

-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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.