web-dev-qa-db-fra.com

Utilitaire de ligne de commande Linux pour résoudre d'abord les noms d'hôte en utilisant / etc / hosts

Il existe plusieurs utilitaires de ligne de commande pour résoudre les noms d'hôte (Host, Dig, nslookup), mais ils utilisent tous exclusivement des serveurs de noms, tandis que les applications en général regardent dans /etc/hosts d'abord (en utilisant gethostbyname je crois).

Existe-t-il un utilitaire de ligne de commande pour résoudre les noms d'hôte qui se comporte comme une application habituelle, regardant ainsi dans /etc/hosts d'abord et seulement ensuite demander un serveur de noms?

(Je suis conscient que ce serait probablement comme 3 lignes de c, mais j'en ai besoin à l'intérieur d'un script Shell quelque peu portable.)

37
Zulan

Ceci est facilement réalisé avec getent:

getent hosts 127.0.0.1

getent effectuera des recherches pour tout type de données configuré dans nsswitch.conf.

57
womble

Un outil qui fonctionnerait est getent . Vous pouvez donc utiliser getent hosts www.google.com, ou getent hosts localhost. Il récupérera les entrées des bases de données comme spécifié dans la configuration de votre commutateur de service de nom /etc/nsswitch.conf .

26
Zoredache

Vous pouvez utiliser un wrapper gethostbyname () (obsolète) comme:

python -c 'import socket;print socket.gethostbyname("www.google.com")'

Ou un wrapper getaddrinfo () comme:

python -c 'import socket;print socket.getaddrinfo("www.google.com","http")[0][4][0]'

Notez que getaddrinfo renverra toutes les instances sous forme de liste. La dernière partie de la commande ne sélectionne que le premier tuple. Cela peut également renvoyer des adresses IPv6.

8
Mircea Vutcovici

resolveip fera cela.

Curieusement, cela fait partie des packages de mysql-server sur RHEL et Ubuntu.

6
cjc

Vous pouvez utiliser [votre langue préférée ici] pour écrire un script qui appelle getnameinfo . C'est ainsi que les binaires (comme le ping) devraient procéder, donc vous êtes assuré d'obtenir le même traitement.

6
Kyle Smith

Utilisation getent ahosts, par exemple:

$ getent ahosts www.google.com | sed -n 's/ *STREAM.*//p'
216.58.210.196
2a00:1450:4006:803::2004

Vous obtiendrez toutes les adresses IPv4 et IPv6, via le résolveur glibc (utilisant ainsi /etc/hosts d'abord, comme d'habitude configuré dans /etc/nsswitch.conf).

Ne pas utiliser getent hosts, car il vous donnera des adresses IPv6 ou IPv4 (pas les deux), et le protocole choisi peut ne pas être celui qui ne fonctionne pas. En effet, les adresses IPv6 sont généralement préférées, mais à certains endroits, les données IPv6 sont filtrées (non prises en charge) par les routeurs.

6
vinc17

"gethostbyname" version en ligne de commande :

#!/usr/bin/Perl
use Socket;

$Host = shift @ARGV;
die("usage: gethostbyname hostname\n") unless(defined($Host));

$packed_ip = gethostbyname($Host);

if (defined $packed_ip) {
    $ip_address = inet_ntoa($packed_ip);
    print "$ip_address\n";
    exit 0
} else {
    warn "$Host not found\n";
    exit 1
}
3
Erik Aronesty

Vous pourriez être vraiment hacky et utiliser arp:

arp -n somehostname | tr -d '()' | awk '{print $2}'

mais ce serait vraiment moche donc tu ne devrais pas faire ça.

2
Paul M

getent hosts est cassé. Il préfère les adresses IPv6, gai.conf devrait être configuré pour préférer ipv4 mais ....

Perl gethostbyname utilise la priorité dans /etc/nsswitch.conf

hosts: files dns

Cela fonctionne donc comme getent hosts devrait fonctionner pour moi.

Aussi:

Perl -e 'use Socket; print inet_ntoa(inet_aton("www.google.com")) . "\n";'

devrait marcher.

2
Jan Wortelboer

Essaye ça:

if [ `grep -c "hostname" /etc/hosts` -ge 1 ]; then
    ip=`awk '/hostname/ { print $1 }' /etc/hosts`
else
    ip=`Host hostname | awk '/hostname has address/ { print $4 }'`
fi
1
quanta