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


15

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

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

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


如果有时CNAME是您要查找的内容而不是A记录,那么您如何知道哪个是“正确的” FQN?
尼尔斯2012年

Answers:


11

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

1
我开始host -TtA $(hostname -s)|grep "has address"|awk '{print $1}'使用Redhat服务器工作
-VonC

这在mac osx 10.11.6上有效,尽管每个IP分配一行,但在osx 10.12.1上无效。我不确定是由于我的机器的设置还是固有的原因,它在v12上是否失败。
AnneTheAgile

更新;对于使用AD LDAP的Mac,最简单的方法是解析:dsconfigad -show
AnneTheAgile

5

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

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.

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

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


5

仅当您正确配置了主机名并具有正确的dns设置等之后,该方法才起作用。如果拥有所有这些,则您已经知道您的fqdn。

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

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


是的,但是在我的上下文(全球企业)中,我所有的服务器都具有fqn,并且具有正确的dns设置。我需要的服务器应该只有一个fqdn。
VonC 2012年

因此,解析答案host仅得到A记录(或进行相应查找)。
尼尔斯2012年

@Nils:这似乎是个好建议。您能回答我吗?我支持并(接受测试)接受吗?
VonC 2012年

4

hostname --fqdn适合您吗?


不,正如问题中明确指出的那样。在服务器上,我必须获取FQDN信息,hostname --fqdn返回短名称,其中fqdn定义为主机名别名之一。
VonC 2012年

哦,对,我没有意识到-f并且--fqdn是同一回事。
ThatGraemeGuy 2012年


2

对于跨平台替代方案,如果您不介意使用python(至少在python 2.7和python 3上运行)

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

-1

一种OS X安全的仅bash方法,由于命令输出的变化,该方法可能无法使用其他* nix风格:

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

Python可能是实现广泛兼容性的最佳选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.