Come ottenere il nome completo (FQN) su Unix in uno script bash?


15

Ho testato hostnamesu diversi server (RedHat, Ubuntu) e si hostname -fè dimostrato inaffidabile, restituendo a volte solo il nome breve (come descritto in questa domanda ).

Riesco a vedere il nome di dominio negli alias: hostname -a(uno degli alias è il nome di dominio che cerco), ma l'ordine degli alias non è fisso.

C'è un altro modo per ottenere in modo affidabile il nome completo e memorizzarlo in una variabile bash?


Se a volte il CNAME è quello che stai cercando e non il record A, come fai a sapere qual è il FQN "giusto"?
Nils,

Risposte:


11

Ho provato questo su CentOS5:

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

Devo interrogare il mio DNS in modalità TCP. Se UDP funziona nel tuo ambiente, lascia l'opzione "T".


Nota: su un guest Ubuntu (VirtualBox) non funzionerà:

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

Quindi, per coprire tutti i casi:

fqn=$(host -TtA $(hostname -s)|grep "has address"|awk '{print $1}') ; \
if [[ "${fqn}" == "" ]] ; then fqn=$(hostname -s) ; fi ; \
echo "${fqn}"

1
Ho host -TtA $(hostname -s)|grep "has address"|awk '{print $1}'lavorato sui miei server
Redhat

Funziona su mac osx 10.11.6, sebbene fornisca una riga per IP, ma non su osx 10.12.1. Non sono sicuro se fallisce su v12 a causa della configurazione della mia macchina o intrinsecamente.
AnneTheAgile,

Aggiornare; per mac con AD LDAP, il modo più semplice è analizzare: dsconfigad -show
AnneTheAgile

5

Ecco un modo in cui ho trovato il nome di dominio completo:

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

In altre parole, ho avuto nslookupl'indirizzo IP, che mi dà qualcosa di simile:

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

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

Da lì, era solo una questione di rimuovere ciò che non volevo, attraverso manipolazioni di stringhe di bash .

Forse c'è un modo più semplice?


5

Il tuo metodo funziona solo se hai configurato correttamente il tuo nome host e hai le impostazioni DNS corrette, ecc. Se hai tutto questo, allora conosci già il tuo fqdn.

Non esiste un modo affidabile per ottenere il fqdn. Un singolo indirizzo IP può avere diversi fqdn e un singolo fqdn può avere diversi indirizzi IP ... e molti IP non hanno alcun fqdn.

Se la tua macchina è direttamente connessa a Internet, usa semplicemente l'indirizzo IP e fai una richiesta DNS inversa: host 1.2.3.4
ma molto spesso questo non ti dà la risposta desiderata (prova ad esempio con Google).


Vero, ma nel mio contesto (impresa mondiale), tutti i miei server hanno un fqn e hanno impostazioni DNS corrette. I server di cui ho bisogno dovrebbero avere solo un fqdn.
VonC

Quindi analizza la risposta hostper ottenere solo il record A (o effettuare una ricerca appropriata).
Nils,

@Nils: sembra un buon suggerimento. Potresti farne una risposta, per me votare e (dopo il test) accettare?
VonC

4

Non hostname --fqdnfunziona per te?


No, come chiaramente indicato nella domanda. Sui server devo ottenere le informazioni FQDN, hostname --fqdnrestituisce il nome breve, con fqdn definito come uno degli alias hostname.
VonC

Oh giusto, non me ne sono reso conto -fe --fqdnsono la stessa cosa.
ThatGraemeGuy


2

Per un'alternativa multipiattaforma, se non ti dispiace usare Python (funziona almeno su Python 2.7 e Python 3)

python -c 'import socket; print(socket.getfqdn())'

-1

Un metodo OS X solo bash sicuro, che probabilmente non funzionerà con altri * nix sapori a causa delle variazioni nell'output del comando:

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

Python è probabilmente la soluzione migliore per un'ampia compatibilità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.