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


15

Eu testei hostnameem vários servidores (RedHat, Ubuntu) e hostname -fprovou não ser confiável, retornando algumas vezes apenas o nome abreviado (conforme descrito nesta pergunta ).

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

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


Se às vezes o CNAME é o que você está procurando e não o registro A, como você sabe qual é o FQN "certo"?
Nils

Respostas:


11

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}"

1
Eu fui host -TtA $(hostname -s)|grep "has address"|awk '{print $1}'trabalhar em meus servidores RedHat
VonC

Isso funciona no mac osx 10.11.6, embora dê uma linha por IP, mas não no osx 10.12.1. Não tenho certeza se ele falhar na v12 devido à configuração da minha máquina ou inerentemente.
AnneTheAgile #

Atualizar; para Mac usando AD LDAP, maneira mais fácil é parse: dsconfigad -show
AnneTheAgile

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 nslookupo 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.

A partir daí, era apenas uma questão de remover o que eu não queria, através de manipulações de strings do bash .

Talvez haja uma maneira mais simples?


5

Seu método funciona apenas se você tiver configurado corretamente o nome do host e as configurações corretas de DNS, etc. Se você tiver tudo isso, já conhece o seu fqdn.

Não há 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 IP não têm nenhum fqdn.

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


É verdade, mas no meu contexto (empresa mundial), todos os meus servidores têm um fqn e configurações de DNS corretas. Os servidores que eu preciso devem ter apenas um fqdn.
VonC 7/12/12

Portanto, analise a resposta hostpara obter apenas o registro A (ou faça uma pesquisa correspondente).
Nils

@ Nils: isso parece uma boa sugestão. Você poderia fazer uma resposta para eu votar e (depois do teste) aceitar?
VonC

4

Não hostname --fqdnfunciona para você?


Não, conforme claramente indicado na pergunta. Nos servidores, tenho que obter as informações do FQDN, hostname --fqdnretorna o nome abreviado, com o fqdn definido como um dos aliases do nome do host.
VonC 7/03/12

Ah, certo, eu não percebi -fe --fqdné a mesma coisa.
precisa saber é o seguinte


2

Para uma alternativa multiplataforma, se você não se importa em usar python (roda pelo menos no python 2.7 e python 3)

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

-1

Um método somente para bash seguro do OS X, que provavelmente não funcionará com outros sabores * nix devido a variações na saída do comando:

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

Provavelmente, o Python é sua melhor aposta para uma ampla compatibilidade.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.