Wie erhalte ich den vollqualifizierten Namen (FQN) unter Unix in einem Bash-Skript?

15

Ich habe hostnameauf mehreren Servern (RedHat, Ubuntu) getestet und mich hostname -fals unzuverlässig erwiesen. Manchmal habe ich nur den Kurznamen zurückgegeben (wie in dieser Frage beschrieben ).

Ich kann die FQN in den Aliasnamen sehen: hostname -a(Einer der Aliasnamen ist der von mir gesuchte FQN), aber die Reihenfolge der Aliasnamen ist nicht festgelegt.

Gibt es eine andere Möglichkeit, den vollständig qualifizierten Namen zuverlässig abzurufen und in einer Bash-Variablen zu speichern?

VonC
quelle
Wenn manchmal der CNAME das ist, wonach Sie suchen, und nicht der A-Record, woher wissen Sie, welcher der "richtigen" FQN ist?
Nils

Antworten:

11

Ich habe es auf CentOS5 versucht:

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

Ich muss meinen DNS im TCP-Modus abfragen. Wenn UDP in Ihrer Umgebung funktioniert, lassen Sie die Option "T" weg.


Hinweis: Auf einem Ubuntu- Gast (VirtualBox) funktioniert es nicht:

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

Um alle Fälle abzudecken:

fqn=$(host -TtA $(hostname -s)|grep "has address"|awk '{print $1}') ; \
if [[ "${fqn}" == "" ]] ; then fqn=$(hostname -s) ; fi ; \
echo "${fqn}"
Nils
quelle
1
Ich habe host -TtA $(hostname -s)|grep "has address"|awk '{print $1}'an meinen
Red Hat
Dies funktioniert unter Mac OSX 10.11.6, gibt jedoch eine Zeile pro IP, jedoch nicht unter OSX 10.12.1. Ich bin nicht sicher, ob es auf v12 aufgrund des Setups meines Computers oder von Natur aus fehlschlägt.
AnneTheAgile
Aktualisieren; Für Mac mit AD LDAP ist das Parsen am einfachsten: dsconfigad -show
AnneTheAgile
5

Hier ist eine Möglichkeit, wie ich die FQN fand:

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

Mit anderen Worten, ich musste an nslookupdie IP-Adresse, die mir so etwas gibt:

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

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

Von da an ging es nur darum, durch Bash-String-Manipulationen das zu entfernen, was ich nicht wollte .

Vielleicht gibt es einen einfacheren Weg?

VonC
quelle
5

Ihre Methode funktioniert nur, wenn Sie Ihren Hostnamen richtig konfiguriert haben und die richtigen DNS-Einstellungen usw. haben. Wenn Sie all das haben, dann kennen Sie Ihren FQDN bereits.

Es gibt keinen zuverlässigen Weg, um die FQDN zu erhalten. Eine einzelne IP-Adresse kann mehrere FQDN haben, und eine einzelne FQDN kann mehrere IP-Adressen haben ... und viele IP-Adressen haben überhaupt keine FQDN.

Wenn Ihr Computer direkt mit dem Internet verbunden ist, verwenden Sie einfach die IP-Adresse und stellen Sie eine umgekehrte DNS-Anfrage: host 1.2.3.4
Dies gibt Ihnen jedoch häufig nicht die gewünschte Antwort (versuchen Sie es zum Beispiel mit Google).

Gregory MOUSSAT
quelle
Richtig, aber in meinem Kontext (weltweites Unternehmen) haben alle meine Server eine FQN und die richtigen DNS-Einstellungen. Die Server, die ich brauche, sollten nur eine fqdn haben.
Vom
Analysieren Sie also die Antwort von host, um nur die A-Aufzeichnung zu erhalten (oder führen Sie eine entsprechende Suche durch).
Nils
@Nils: das scheint ein guter vorschlag zu sein. Könnten Sie mir eine Antwort geben, damit ich zustimme und (nach dem Test) akzeptiere?
Vom
4

Funktioniert hostname --fqdnbei dir nicht

ThatGraemeGuy
quelle
Nein, wie in der Frage klar angegeben. Auf den Servern, auf denen ich die FQDN-Informationen hostname --fqdnabrufen muss , wird der Kurzname zurückgegeben, wobei fqdn als einer der Hostnamen-Aliase definiert ist.
Vom
Oh richtig, ich habe es nicht gemerkt -fund bin --fqdndasselbe.
ThatGraemeGuy
2

In Ubuntu ist das möglich hostname -A

oarevalo
quelle
2

Als plattformübergreifende Alternative, wenn Sie nichts dagegen haben, Python zu verwenden (läuft mindestens unter Python 2.7 und Python 3)

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

Eine OS X-Safe-Bash-Only-Methode, die aufgrund von Variationen in der Befehlsausgabe wahrscheinlich nicht mit anderen * nix-Varianten funktioniert:

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

Python ist wahrscheinlich die beste Wahl für eine breite Kompatibilität.

Joshua See
quelle