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.)
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
.
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
.
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.
resolveip
fera cela.
Curieusement, cela fait partie des packages de mysql-server sur RHEL et Ubuntu.
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.
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.
"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
}
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.
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.
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