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

8voto

Kyle Smith Points 9443

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

7voto

Vous pouvez être très maladroit et utiliser arp :

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

mais ce serait vraiment moche, il ne faut donc pas le faire.

5voto

Erik Aronesty Points 268

"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
}

3voto

quanta Points 49664

Essayez ceci :

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

3voto

aek Points 1

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

Le Perl gethostbyname utilise l'ordre de préséance dans /etc/nsswitch.conf

hosts: files dns

Cela fonctionne donc comme suit getent hosts devrait fonctionner pour moi.

En outre :

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

devrait fonctionner.

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