60 votes

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

Il existe plusieurs utilitaires en ligne de commande pour résoudre les noms d'hôtes ( host , dig , nslookup ), mais ils utilisent tous exclusivement des serveurs de noms, alors que les applications en général consultent le site /etc/hosts d'abord (en utilisant gethostbyname je crois).

Existe-t-il un utilitaire en ligne de commande pour résoudre les noms d'hôtes qui se comporte comme une application habituelle, c'est-à-dire qui recherche dans /etc/hosts d'abord et ensuite seulement en demandant un serveur de noms ?

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

83voto

Ryan Sampson Points 2898

Ceci est facilement réalisable avec getent :

getent hosts 127.0.0.1

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

36voto

jammus Points 1796

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

Pour des implémentations plus modernes, utiliser getent ahosts www.google.com ce qui donnera plusieurs résultats.

15voto

vinc17 Points 193

Utilice 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 (en utilisant donc /etc/hosts d'abord, comme cela est généralement configuré dans /etc/nsswitch.conf ).

Ne pas utiliser getent hosts Il vous donnera soit des adresses IPv6, soit des adresses IPv4 (pas les deux), et le protocole choisi n'est pas forcément un protocole 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.

11voto

jcollum Points 10236

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

Pour python3 :

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

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

9voto

cjc Points 24265

resolveip le fera.

Curieusement, il fait partie des paquets mysql-server sur RHEL et Ubuntu.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X