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.