Como obter o nome totalmente qualificado (FQN) no Unix em um script bash?

14

Eu testei hostname em vários servidores (RedHat, Ubuntu) e hostname -f provou não ser confiável, retornando em algum momento apenas o nome abreviado (conforme descrito em esta questão ).

Eu posso ver o fqn nos aliases: hostname -a (um dos aliases é o fqn que eu procuro), mas a ordem dos aliases não é fixa.

Existe outra maneira de obter o nome totalmente qualificado de forma confiável e armazená-lo em uma variável bash?

    
por VonC 07.03.2012 / 11:10

7 respostas

9

Eu tentei isso no CentOS5:

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

Eu tenho que consultar meu DNS no modo TCP. Se o UDP funcionar no seu ambiente, deixe de lado a opção "T".

Nota: em um convidado do Ubuntu (VirtualBox) não funcionará:

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

Então, para cobrir todos os casos:

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

Aqui está uma maneira de encontrar o fqn:

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

Em outras palavras, eu tive que nslookup do endereço IP, o que me dá algo como:

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

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

De lá, foi apenas uma questão de remover o que eu não queria, através de manipulações de string bash .

Talvez haja uma maneira mais simples?

    
por 07.03.2012 / 11:11
5

Seu método funciona somente se você configurou corretamente seu nome de host, e tem as configurações corretas de dns, etc. Se você tem tudo isso, então você já conhece seu fqdn.

Não existe uma maneira confiável de obter o fqdn. Um único endereço IP pode ter vários fqdn, e um único fqdn pode ter vários endereços IP ... e muitos IPs não têm nenhum fqdn.

Se a sua máquina estiver diretamente conectada à Internet, basta usar o endereço IP e fazer uma solicitação reversa de DNS: host 1.2.3.4
Mas isso muitas vezes não dá a resposta desejada (apenas tente com o google, por exemplo).

    
por 07.03.2012 / 13:20
2

Para a alternativa de plataforma cruzada, se você não se importar em usar o python (executado pelo menos no python 2.7 e no python 3)

python -c 'import socket; print(socket.getfqdn())'
    
por 28.11.2016 / 13:53
0

O hostname --fqdn não funciona para você?

    
por 07.03.2012 / 15:40
0

No Ubuntu, você pode fazer hostname -A

    
por 06.12.2016 / 19:56
-1

Um método bash safe do OS X, que provavelmente não funcionará em outros tipos * nix devido a variações na saída do comando:

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

O Python é provavelmente sua melhor aposta para uma ampla compatibilidade.

    
por 27.11.2017 / 23:53