Comment obtenir le nom complet (FQN) sous Unix dans un script bash?

15

J'ai testé hostnamesur plusieurs serveurs (RedHat, Ubuntu), et hostname -fs'est avéré peu fiable, renvoyant parfois le nom court uniquement (comme décrit dans cette question ).

Je peux voir le fqn dans les alias: hostname -a(l'un des alias est le fqn que je recherche), mais l'ordre des alias n'est pas fixe.

Existe-t-il un autre moyen d'obtenir le nom complet de manière fiable et de le stocker dans une variable bash?

VonC
la source
Si parfois le CNAME est ce que vous recherchez et non pas l'enregistrement A, comment savez-vous quel est le "bon" FQN?
Nils

Réponses:

11

J'ai essayé ceci sur CentOS5:

host -TtA $SERVERNAME|grep "has address"|awk '{print $1}'

Je dois interroger mon DNS en mode TCP. Si UDP fonctionne dans votre environnement, laissez l'option "T".


Remarque: sur un invité Ubuntu (VirtualBox), cela ne fonctionnera pas:

git@aHostname:~/$ host -TtA $(hostname -s)
Host aHostname not found: 3(NXDOMAIN)

Donc pour couvrir tous les cas:

fqn=$(host -TtA $(hostname -s)|grep "has address"|awk '{print $1}') ; \
if [[ "${fqn}" == "" ]] ; then fqn=$(hostname -s) ; fi ; \
echo "${fqn}"
Nils
la source
1
J'ai commencé à host -TtA $(hostname -s)|grep "has address"|awk '{print $1}'travailler sur mes serveurs redhat
VonC
Cela fonctionne sur mac osx 10.11.6, bien que donnant une ligne par IP, mais pas sur osx 10.12.1. Je ne sais pas s'il échoue sur la v12 en raison de la configuration de ma machine ou intrinsèquement.
AnneTheAgile
Mise à jour; pour mac utilisant AD LDAP, le moyen le plus simple est d'analyser: dsconfigad -show
AnneTheAgile
5

Voici une façon dont j'ai trouvé le fqn:

fqn=$(nslookup $(hostname -i)) ; fqn=${fqn##*name = } ; fqn=${fqn%.*} ; echo $fqn

En d'autres termes, je devais nslookupl'adresse IP, ce qui me donne quelque chose comme:

Server:         128.xxx.yyy.zzz
Address:        128.xxx.yyy.zzz#ww

aa.bb.cc.dd.in-addr.arpa        name = myserver.fully.qualified.name.

À partir de là, il s'agissait simplement de supprimer ce que je ne voulais pas, grâce à des manipulations de chaînes bash .

Peut-être qu'il existe un moyen plus simple?

VonC
la source
5

Votre méthode ne fonctionne que si vous avez correctement configuré votre nom d'hôte et que vous avez les bons paramètres DNS, etc. Si vous avez tout cela, vous connaissez déjà votre nom de domaine complet.

Il n'y a aucun moyen fiable d'obtenir le fqdn. Une seule adresse IP peut avoir plusieurs fqdn, et un seul fqdn peut avoir plusieurs adresses IP ... et beaucoup d'IP n'ont pas de fqdn du tout.

Si votre machine est directement connectée à Internet, utilisez simplement l'adresse IP et faites une requête DNS inversée: host 1.2.3.4
mais cela ne vous donne pas souvent la réponse souhaitée (essayez simplement avec google par exemple).

Gregory MOUSSAT
la source
Certes, mais dans mon contexte (entreprise mondiale), tous mes serveurs ont un fqn et des paramètres DNS corrects. Les serveurs dont j'ai besoin ne devraient avoir qu'un seul FQDN.
VonC
Analysez donc la réponse de hostpour obtenir uniquement l'enregistrement A (ou effectuez une recherche correspondante).
Nils
@Nils: cela semble une bonne suggestion. Pourriez-vous en faire une réponse, pour moi de voter et (après le test) d'accepter?
VonC
4

Ça ne hostname --fqdnmarche pas pour toi?

ThatGraemeGuy
la source
Non, comme indiqué clairement dans la question. Sur les serveurs, je dois obtenir les informations FQDN, hostname --fqdnrenvoie le nom court, avec le fqdn défini comme l'un des alias de nom d'hôte.
VonC
Oh oui, je ne m'en suis pas rendu compte -fet --fqdnc'est la même chose.
ThatGraemeGuy
2

Dans Ubuntu, vous pouvez faire hostname -A

oarevalo
la source
2

Pour une alternative multiplateforme, si cela ne vous dérange pas d'utiliser python (fonctionne au moins sur python 2.7 et python 3)

python -c 'import socket; print(socket.getfqdn())'
jakub.g
la source
-1

Une méthode bash uniquement OS X, qui ne fonctionnera probablement pas avec d' autres versions * nix en raison des variations de la sortie de la commande:

fqn=$(nslookup $(hostname) | sed -n s/Name:.//p);

Python est probablement votre meilleur pari pour une large compatibilité.

Joshua See
la source