如何在Unix上的bash脚本中获得完全限定名(FQN)?

我已经testing了几个服务器(RedHat,Ubuntu)上的hostname -f ,而且hostname -f已经被certificate是不可靠的,只返回短名(正如这个问题所描述的那样)。

我可以在别名中看到fqn: hostname -a (其中一个别名是我查找的fqn),但别名的顺序不固定。

有没有另一种方法来获得完全合格的名称可靠,并将其存储在一个bashvariables?

我在CentOS5上试过这个:

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

我必须在TCP模式下查询我的DNS。 如果UDP在您的环境中工作,请不要使用“T”选项。


注意:在一个Ubuntu 客人 (VirtualBox)上它不会工作:

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

所以要涵盖所有的情况:

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

你的方法只有在你正确地configuration了你的主机名,并且有正确的dns设置等的情况下才起作用。如果你有这些,那么你已经知道你的fqdn了。

没有可靠的方法来获得fqdn。 一个IP地址可以有多个fqdn,一个fqdn可以有多个IP地址……许多IP根本没有任何fqdn。

如果您的机器直接连接到互联网,只需使用IP地址并进行反向DNS请求: host 1.2.3.4
但是,这往往不会给你想要的答案(只是尝试与谷歌例如)。

这是我findfqn的一个方法:

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

换句话说,我不得不nslookup的IP地址,这给了我这样的:

 Server: 128.xxx.yyy.zzz Address: 128.xxx.yyy.zzz#ww aa.bb.cc.dd.in-addr.arpa name = myserver.fully.qualified.name. 

从那里,这只是一个通过bashstring操作去除我不想要的东西的问题。

也许有一个更简单的方法?

对于跨平台的替代,如果你不介意使用python(python3)

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

hostname --fqdn为你工作?

在Ubuntu中,你可以做hostname -A