Estoy en el shell y quiero saber las direcciones IP correspondientes a un nombre de host.
Sé que podría obtenerlo a través de Perl, PHP, Python o varios otros lenguajes de programación (¡probablemente incluso awk!), y esta será mi solución, pero me sorprende que no parezca haber una herramienta de línea de comandos para hacer esto. , no hay un simple envoltorio alrededor getaddrinfo()
.
¿Me equivoco? ¿Hay uno? host
, dig
y getent
no cuentes, quiero algo que use la libc y actúe de acuerdo con /etc/nsswitch.conf
, y algo que probablemente esté instalado en cualquier sistema (linux) por defecto.
Se mudó aquí desdehttps://stackoverflow.com/questions/20211326/is-there-a-standard-command-line-tool-to-do-a-hostname-lookup
Respuesta: Me equivoqué, getent
no busca exclusivamente en /etc/hosts
, en realidad realiza una búsqueda adecuada.
Respuesta1
la herramienta tradicional para realizar búsquedas de nombres de host es nslookup de bind, pero está siendo reemplazada por dig. Ambas herramientas son específicas de DNS y no utilizan nsswitch. getent hosts usa nsswitch, pero se usa mucho menos.
Respuesta2
getent
es sin duda la herramienta adecuada para el trabajo, pero lamentablemente no está disponible en todas partes, una de las razones es que no es obligatorio que POSIX no lo defina.
Por otro lado, aunque tampoco está especificado en el estándar, arp
es muy poco probable que no esté disponible en ningún servidor que admita resolución de nombres. La arp
siguiente nsswitch.conf
configuración, solo uses libc
, está disponible en cualquier sistema Linux/Unix y proporciona un resultado que parece ser consistente entre las implementaciones; analizar su resultado sería suficiente:
$ arp stackoverflow.com | sed -e 's/.*(//' -e 's/).*$//'
198.252.206.16
Aquí hay una función de shell que usa ese método, evitando un problema con arp de Linux que cambia a un formato de salida diferente en algunos casos extremos:
resolve()
{
: ${1:?Usage: resolve name}
(
PATH=$PATH:/usr/sbin
ao=$(arp $1)
[ "$(echo "$ao"|grep HWaddress)" ] && ao=$(arp -a $1)
echo "$ao" | sed -e 's/.*(//' -e 's/).*$//'
)
}