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

Von*_*onC 15 unix bash hostname

我已经hostname在多台服务器(RedHat、Ubuntu)上进行了测试,结果hostname -f证明不可靠,有时只返回短名称(如本问题所述)。

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

是否有另一种方法可以可靠地获取完全限定名称并将其存储在 bash 变量中?

Nil*_*ils 12

我在 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)
Run Code Online (Sandbox Code Playgroud)

所以要涵盖所有情况:

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


Von*_*onC 6

这是我找到 fqn 的一种方式:

fqn=$(nslookup $(hostname -i)) ; fqn=${fqn##*name = } ; fqn=${fqn%.*} ; echo $fqn
Run Code Online (Sandbox Code Playgroud)

换句话说,我必须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.
Run Code Online (Sandbox Code Playgroud)

从那里开始,这只是通过bash 字符串操作删除我不想要的内容的问题。

也许有更简单的方法?


Gre*_*SAT 5

您的方法仅在您正确配置了主机名并具有正确的 dns 设置等情况下才有效。如果您拥有所有这些,那么您已经知道您的 fqdn。

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

如果您的机器直接连接到互联网,只需使用 IP 地址并发出反向 DNS 请求:host 1.2.3.4
但这通常不会给您所需的答案(例如,只需尝试使用 google)。


Tha*_*Guy 5

hostname --fqdn适合你?