¿Cómo obtener el nombre completo (FQN) en Unix en un script bash?

15

Lo probé hostnameen varios servidores (RedHat, Ubuntu) y hostname -fdemostré ser poco confiable, devolviendo en algún momento solo el nombre corto (como se describe en esta pregunta ).

Puedo ver el fqn en los alias: hostname -a(uno de los alias es el fqn que busco), pero el orden de los alias no es fijo.

¿Hay alguna otra forma de obtener el nombre totalmente calificado de manera confiable y almacenarlo en una variable bash?

VonC
fuente
Si a veces el CNAME es lo que está buscando y no el registro A, ¿cómo sabe cuál es el FQN "correcto"?
Nils

Respuestas:

11

Probé esto en CentOS5:

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

Tengo que consultar mi DNS en modo TCP. Si UDP funciona en su entorno, deje de lado la opción "T".


Nota: en un invitado Ubuntu (VirtualBox) no funcionará:

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

Entonces, para cubrir todos los casos:

fqn=$(host -TtA $(hostname -s)|grep "has address"|awk '{print $1}') ; \
if [[ "${fqn}" == "" ]] ; then fqn=$(hostname -s) ; fi ; \
echo "${fqn}"
Nils
fuente
1
Me host -TtA $(hostname -s)|grep "has address"|awk '{print $1}'trabajando en mis servidores RedHat
VonC
Esto funciona en mac osx 10.11.6, aunque proporciona una línea por IP, pero no en osx 10.12.1. No estoy seguro de si falla en v12 debido a la configuración de mi máquina o inherentemente.
AnneTheAgile
Actualizar; para Mac con AD LDAP, la forma más fácil es analizar: dsconfigad -show
AnneTheAgile
5

Aquí hay una forma en que encontré el fqn:

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

En otras palabras, tenía nslookupla dirección IP, que me da 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 de ahí, fue solo una cuestión de eliminar lo que no quería, a través de manipulaciones de bash string .

Tal vez hay una manera más simple?

VonC
fuente
5

Su método solo funciona si ha configurado correctamente su nombre de host, y tiene la configuración correcta de dns, etc. Si tiene todo eso, entonces ya conoce su fqdn.

No hay una forma confiable de obtener el fqdn. Una sola dirección IP puede tener varias fqdn, y una sola fqdn puede tener varias direcciones IP ... y muchas IP no tienen ninguna fqdn.

Si su máquina está conectada directamente a Internet, simplemente use la dirección IP y realice una solicitud de DNS inversa: host 1.2.3.4
pero esto a menudo no le da la respuesta deseada (solo intente con Google, por ejemplo).

Gregory MOUSSAT
fuente
Es cierto, pero en mi contexto (empresa mundial), todos mis servidores tienen un fqn y tienen la configuración de DNS correcta. Los servidores que necesito deberían tener solo un fqdn.
VonC
Analice la respuesta de hostpara obtener solo el registro A (o realice una búsqueda correspondiente).
Nils
@Nils: esa parece una buena sugerencia. ¿Podría responderle para que yo vote y (después de la prueba) acepte?
VonC
4

¿No te hostname --fqdnfunciona?

ThatGraemeGuy
fuente
No, como se indica claramente en la pregunta. En los servidores tengo que obtener la información del FQDN, hostname --fqdndevuelve el nombre corto, con el fqdn definido como uno de los alias de nombre de host.
VonC
Ah, claro, no me di cuenta -fy --fqdnson lo mismo.
ThatGraemeGuy
2

En Ubuntu, puedes hacer hostname -A

oarevalo
fuente
2

Para la alternativa multiplataforma, si no le importa usar python (se ejecuta al menos en python 2.7 y python 3)

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

Un método OS X safe bash only, que probablemente no funcionará con otros sabores * nix debido a variaciones en la salida del comando:

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

Python es probablemente su mejor apuesta para una amplia compatibilidad.

Joshua See
fuente