Quel est le moyen le plus concis de résoudre un nom d’hôte en une adresse IP dans un script Bash? J'utilise Arch Linux .
linux
bash
networking
dns
Eugene Yarmash
la source
la source
getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>
réponse soit quelque part en bas, près du bas. C'est le plus simple, il ne nécessite aucun paquet supplémentaire et est également plus facile à analyser à partir d'un script Bash.getent hosts somehost
, lors de l' exécution de ce pendantsomehost
produira une adresse IPv6 , qui est différent de la façon dont la plupart des autres outils (ping
,ssh
au moins) résolvent les noms et casse certaines choses. Utilisez leahosts
au lieu dehosts
.ahostsv4
) ou IPv6 (ahostsv6
) spécifiques ? Personnellement, je ne trouve rien de mal à la demande non spécifique renvoyant IPv6. Votre code devrait être préparé. IPv6 existe depuis plus de 20 ans.hosts
. Jusqu'à présent, 4 personnes ont voté pour le commentaire de vinc17 exprimant la douleur causée par "soudainement IPv6". Être prêt pour IPv6 n’est pas toujours le problème: de nombreux programmes ont besoin d’un moyen de déterminer si deux noms / adresses font référence au même hôte. Ils peuvent soit utiliser une simple correspondance de chaîne, soit ils doivent en savoir beaucoup sur le réseau pour trouver la "vraie" réponse. Ce dernier est un champ de mines, de nombreux programmes et systèmes tiers - sur lesquels je n’ai aucun contrôle - utilisent les premiers.Réponses:
Vous pouvez utiliser
getent
ce qui vient avecglibc
(donc vous l’avez presque certainement sous Linux). Cela résout en utilisant gethostbyaddr / gethostbyname2, et vérifiera donc aussi/etc/hosts
/ NIS / etc:Ou, comme le dit Heinzi ci-dessous, vous pouvez utiliser
dig
l'+short
argument (interroge directement les serveurs DNS, ne regarde pas/etc/hosts
/ NSS / etc):Si
dig +short
n'est pas disponible, l'un des éléments suivants devrait fonctionner. Tous ces requêtes DNS directement et ignorent les autres moyens de résolution:Si vous souhaitez uniquement imprimer une adresse IP, ajoutez la
exit
commande à dansawk
le flux de travaux.la source
host www.google.com
,dig +short www.google.com
,host ipv6.google.com
,dig +short ipv6.google.com
,host www.facebook.com
,dig +short www.facebook.com
.host
peut être expiré et ne renvoie rien. Pour certains domaines,dig +short
peut renvoyer un alias de domaine en première ligne. Donc, pour vous assurer que la sortie est une adresse IPv4, utilisezdig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1
.getent hosts <host>
est incorrecte, car elle peut par exemple donner une adresse IPv6 alors que IPv6 ne fonctionne pas. La bonne solution consiste à utilisergetent ahosts <host>
IPv6 et IPv4 si nécessaire.Avec
host
le paquet dnsutils :( Nom du paquet corrigé en fonction des commentaires. Comme note, d'autres distributions ont
host
des paquets différents: hôte Debian / Ubuntu bind9 , openSUSE bind-utils , liaison Frugalware .)la source
host
a bien travaillé, mercihost
parfois, renvoie une sortie multiligne (dans le cas de redirections), vous voudrezhost unix.stackexchange.com | tail -n1
si vous voulez juste la ligne avec l'adresse IP.host
est un outil DNS (similaire ànslookup
), de sorte qu'il ne recherche que les hôtes dans le DNS, pas dans l'exemple/etc/hosts
. Donc, ce n'est pas une réponse à la question de OP.J'ai un outil sur ma machine qui semble faire l'affaire. La page de manuel montre qu'il semble venir avec mysql ... Voici comment vous pouvez l'utiliser:
La valeur de retour de cet outil est différente de 0 si le nom d'hôte ne peut pas être résolu:
UPDATE Sur fedora, il est livré avec mysql-server:
Je suppose que cela créerait une dépendance étrange pour votre script ...
la source
getent
, comme indiqué en détail dans l'autre réponse, examine également / etc / hosts et est fourni avec glibc. Il n'a donc aucune dépendance sur un système Linux.La commande suivante using
dig
vous permet de lire directement le résultat sans sed / awk / etc. la magie:dig
est également inclus dans lednsutils
package.Remarque :
dig
a une valeur de retour de0
, même si le nom n'a pas pu être résolu. Ainsi, vous devrez vérifier si la sortie est vide au lieu de vérifier la valeur de retour:Remarque 2 : Si un nom d'hôte a plusieurs adresses IP (essayez
debian.org
, par exemple), elles seront toutes renvoyées. Ce "problème" concerne tous les outils mentionnés dans cette question jusqu'à présent:la source
la source
ahosts
,ahostsv4
,ahostsv6
avecgetent
.cut
ne sera pas pour getent, qui utilisent\t
pour séparer les colonnes. C'est le cas sous Solaris.cut
sans-d
(valeur par défaut\t
: délimiteur). Sous Linux ce sont des espaces, ainsi la ligne ci-dessus fonctionne.Les solutions proposées jusqu'ici fonctionnent principalement dans le cas le plus simple: le nom d'hôte se résout directement en une adresse IPv4 unique. Cela peut être le seul cas où vous devez résoudre les noms d’hôte, mais si ce n’est pas le cas, vous trouverez ci-dessous une discussion sur certains cas que vous devrez peut-être gérer.
Chris Down et Heinzi ont brièvement évoqué le cas où le nom d'hôte résolvait en plusieurs adresses IP. Dans ce cas (et d'autres ci-dessous), la création de scripts de base en supposant qu'un nom d'hôte soit résolu directement en une seule adresse IP peut échouer. Ci-dessous, un exemple avec un nom d'hôte résolvant en plusieurs adresses IP:
Mais qu'est ce que c'est
www.l.google.com
? C'est ici que le cas du pseudonyme doit être introduit. Vérifions l'exemple ci-dessous:Donc,
www.google.com
ne pas résoudre directement en adresses IP, mais en un alias qui se résout lui-même en plusieurs adresses IP. Pour plus d'informations sur les alias, cochez cette case . Bien entendu, le cas où un alias a une seule adresse IP est possible, comme indiqué ci-dessous:Mais les alias peuvent-ils être enchaînés? La réponse est oui:
Je n'ai trouvé aucun exemple dans lequel un nom d'hôte résout un alias qui ne se résout pas en une adresse IP, mais je pense que le cas pourrait se produire.
Plus que de multiples adresses IP et alias, existe-t-il d'autres cas particuliers ... qu'en est-il de l'IPv6? Tu pourrais essayer:
Où le nom d'hôte
ipv6.google.com
est un nom d'hôte IPv6 uniquement. Qu'en est-il des noms d'hôte à double pile:Encore une fois à propos de IPv6, si votre hôte est uniquement IPv4, vous pouvez toujours résoudre les adresses IPv6 (testé sur un IPX4 uniquement sous WinXP et avec ipv6.google.com, vous pouvez l’essayer sous Linux). Dans ce cas, la résolution aboutit, mais une requête ping échoue avec un message d'erreur d'hôte inconnu . Cela peut être un cas où votre script échoue.
J'espère que ces remarques ont été utiles.
la source
host
ne dit même pas "a l'adresse" pour mes boîtes.Pour éviter le problème des alias et toujours préparer une adresse IP unique:
la source
fonctionne sans dépendances sur d'autres systèmes (et pour les hôtes spécifiés dans / etc / hosts)
la source
ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1
getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>
travaille pour les déclarations à l' intérieur/etc/hosts
aussi ... et il est le go-to-outil pour tous les types de bases de données système (passwd, groupe, alias, services).Simple mais utile:
getent ahostsv4 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
getent ahostsv6 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
getent hosts google.de | head -n 1 | cut -d ' ' -f 1
Toutes les commandes vont résoudre une adresse IP si l'hôte existe toujours. Si l'hôte pointe sur CNAME, il obtiendra également l'adresse IP dans ce cas.
La première commande renvoie l'adresse IPv4 résolue.
La deuxième commande renvoie l'adresse IPv6 résolue.
La troisième commande retournera l'adresse préférée du propriétaire, quelle que soit l'adresse IPv4 ou IPv6.
la source
host
ça nécessite l'installation de labindutils
Voici une légère variante de l'
ping
approche qui prend en compte "hôte inconnu" (en passant par stderr) et utilisetr
pour éviter l'utilisation dessed
expressions rationnelles:S'il est important de capturer la valeur de sortie, les actions suivantes fonctionneront (bien que moins élégantes):
la source
Pour compléter la réponse de Chris Down et répondre aux commentaires de jfgagne sur les alias (éventuellement chaînés), voici une solution qui:
/etc/hosts
fichier (dans mon cas, je n'en voulais pas); pour l'interroger, la solution python de dbernt est parfaite)n'utilise pas awk / sed
Retourne toujours la première adresse IP ou vide si non résolu. avec version de dig:
la source
la source
J'aurais aimé ajouter ceci comme commentaire à Andrew McGregor Re: ping. Cependant, cela ne me le laisserait pas, alors je dois ajouter ceci comme une autre réponse. (Si quelqu'un peut le déplacer dans un commentaire, n'hésitez pas.)
C'est une autre variante, utilisant uniquement ping et grep:
grep -E
pour une expression régulière étendue etgrep -o
pour ne renvoyer que la partie correspondante. l'expression rationnelle elle-même recherche un ou plusieurs chiffres ([0-9]+
) et éventuellement un point (\.?
) quatre fois ({4}
)la source
Vous pouvez utiliser
host
:la source
Voici une recette de Bash que j'ai concoctée en utilisant les réponses d'autres personnes - essayez d'abord
/etc/hosts
, puis retombez dans nslookup:la source
getent hosts
n'est pas simplement une recherche dans / etc / hosts - c'est un appel à résolution DNS complet pour gethostbyaddr (3) , et il est très peu probable qu'un échec se produise dans les cas oùdig
cela réussira. Voir la page de manuel pour getent .getent
reste mon préféré, même si j'aime aussidig +short
était la solution que j'ai trouvée sans serveur DNS
la source
Peut-être pas le plus concis, mais il semble être robuste et efficace:
Cela produira une seule adresse IPv4, ainsi qu’un retour
1
en cas de défaillance, tout en masquant la sortie stderr.Vous pouvez l'utiliser comme ceci:
Si vous souhaitez plutôt une adresse IPv6, remplacez simplement
-4
par-6
.la source
dig +noall +answer +nocomments example.com | awk '{printf "%-36s\t%s\n", $1, $5 }'
la source
1 ligne résoudre une liste de nom d'hôte
la source
Je le fais tout le temps sur mon Mac qui n'a pas
getent
.ping
semble être un hack. J'aimerais aussi en tenir/etc/hosts
compte.Donc, j'ai écrit un wrapper stupide
dns.lookup
pour vous qui avez Node.js installé pour fournir une CLI:la source
dig est trop lent, nslookup est beaucoup plus rapide
la source
Je ne connais pas le moyen le plus simple pour un script bash, mais si vous voulez résoudre un nom d'hôte et voir si l'hôte est actif, utilisez-le
ping
!Est-ce que
ping
l'hôte une fois et résoudre le nom d'hôte en adresse IP.la source
Oui, il y a déjà beaucoup de réponses, mais il manque une solution utilisant perl:
Dans un script bash, il pourrait être utilisé comme ceci:
Les modules utilisés ici sont des modules de base, ils devraient donc être disponibles partout sans installation avec CPAN.
la source
perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null
est beaucoup plus propre. mais personne d'autre que nous n'utilisons pörl, tout le monde utilise bien sûr le script Pascal.Can't call method "addr" on an undefined value
Ce n’est pas exactement le meilleur message d’erreur, mais peut donner un indice sur le problème.la source
print
devrait probablement être utilisée à la place dep
.cette commande affiche l'adresse IP (reslove le domaine sur IP)
la source
Outre la solution ci-dessus, vous pouvez traduire plusieurs noms d'hôte en ip via le script ci-dessous. La seule dépendance est la commande "ping" dans le noyau Unix:
la source