Jak uzyskać w pełni kwalifikowaną nazwę (FQN) na Uniksie w skrypcie bash?

15

Testowałem hostnamena kilku serwerach (RedHat, Ubuntu) i hostname -fokazałem się niewiarygodny, zwracając kiedyś tylko krótką nazwę (jak opisano w tym pytaniu ).

Widzę fqn w aliasach: hostname -a(jednym z aliasów jest fqn, którego szukam), ale kolejność aliasów nie jest ustalona.

Czy istnieje inny sposób niezawodnego uzyskania w pełni kwalifikowanej nazwy i zapisania jej w zmiennej bash?

VonC
źródło
Jeśli czasami CNAME jest tym, czego szukasz, a nie rekordem A, skąd wiesz, która jest „właściwa” nazwa FQN?
Nils,

Odpowiedzi:

11

Próbowałem tego na CentOS5:

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

Muszę przesłać zapytanie do mojego DNS w trybie TCP. Jeśli UDP działa w twoim środowisku, pozostaw opcję „T”.


Uwaga: w przypadku gościa Ubuntu (VirtualBox) nie będzie działać:

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

Aby objąć wszystkie przypadki:

fqn=$(host -TtA $(hostname -s)|grep "has address"|awk '{print $1}') ; \
if [[ "${fqn}" == "" ]] ; then fqn=$(hostname -s) ; fi ; \
echo "${fqn}"
Nils
źródło
1
Dostałem host -TtA $(hostname -s)|grep "has address"|awk '{print $1}'pracę na moich serwerach RedHat
VonC
Działa to na Mac OSX 10.11.6, chociaż daje jedną linię na IP, ale nie na OSX 10.12.1. Nie jestem pewien, czy nie powiedzie się w wersji 12 z powodu konfiguracji mojego komputera, czy też z natury.
AnneTheAgile,
Aktualizacja; dla komputerów Mac korzystających z AD LDAP najłatwiej jest to przeanalizować: dsconfigad -show
AnneTheAgile
5

Oto jeden ze sposobów, w jaki znalazłem fqn:

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

Innymi słowy, miałem nslookupadres IP, który daje mi coś takiego:

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

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

Stamtąd chodziło tylko o usunięcie tego, czego nie chciałem, poprzez manipulacje sznurkiem .

Może istnieje prostszy sposób?

VonC
źródło
5

Twoja metoda działa tylko wtedy, gdy poprawnie skonfigurowałeś nazwę hosta i masz prawidłowe ustawienia dns itp. Jeśli masz to wszystko, to już znasz swój fqdn.

Nie ma niezawodnego sposobu na uzyskanie fqdn. Pojedynczy adres IP może mieć kilka FQDN, a jeden FQDN może mieć kilka adresów IP ... a wiele adresów IP w ogóle nie ma FQDN.

Jeśli twoje urządzenie jest bezpośrednio podłączone do Internetu, po prostu użyj adresu IP i prześlij żądanie DNS w odwrotnym kierunku: host 1.2.3.4
Ale to bardzo często nie daje pożądanej odpowiedzi (po prostu spróbuj na przykład w Google).

Gregory MOUSSAT
źródło
To prawda, ale w moim kontekście (przedsiębiorstwo na całym świecie) wszystkie moje serwery mają FQN i poprawne ustawienia DNS. Serwery, których potrzebuję, powinny mieć tylko jeden plik fqdn.
VonC,
Więc przeanalizuj odpowiedź, hostaby uzyskać tylko rekord A (lub wykonaj odpowiednie wyszukiwanie).
Nils,
@Nils: to wydaje się dobrą sugestią. Czy możesz udzielić mi odpowiedzi, aby głosować i (po teście) zaakceptować?
VCC
5

Nie hostname --fqdndziała dla ciebie?

ThatGraemeGuy
źródło
Nie, jak jasno stwierdzono w pytaniu. Na serwerach muszę uzyskać informacje o FQDN, hostname --fqdnzwraca krótką nazwę, przy czym fqdn jest zdefiniowany jako jeden z aliasów nazw hostów.
VCC,
No tak, nie zdawałem sobie sprawy -fi --fqdnsą tym samym.
ThatGraemeGuy
2

W Ubuntu możesz to zrobić hostname -A

oarevalo
źródło
2

Dla alternatywy dla wielu platform, jeśli nie masz nic przeciwko użyciu Pythona (działa przynajmniej w Pythonie 2.7 i Pythonie 3)

python -c 'import socket; print(socket.getfqdn())'
jakub.g
źródło
-1

Metoda tylko bezpiecznego basha w OS X, która prawdopodobnie nie zadziała z innymi wariantami * nix ze względu na różnice w danych wyjściowych poleceń:

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

Python jest prawdopodobnie najlepszym wyborem dla szerokiej kompatybilności.

Joshua See
źródło