我有一台更改了主机名的机器。我用命令更改了/etc/hosts
、/etc/sysconfig/network
、 和hostname
。hostname
返回正确的短名称,hostname --fqdn
返回预期的 FQDN,但hostname -A
返回旧名称。我更改了计算机的 IP 地址,以确保它不是外部 DNS 缓存。
如果我打开 python 并运行
import socket
print(socket.gethostname())
print(socket.getfqdn())
两者都返回旧主机名/fqdn,与hostname -A
从主机名手册页来看,它似乎--fqdn
只是采用短名称和域并将它们放在一起。
显示 FQDN(完全限定域名)。 FQDN 由短主机名和 DNS 域名组成。除非您使用绑定或 NIS 进行主机查找,否则您可以在 /etc/hosts 文件中更改 FQDN 和 DNS 域名(是 FQDN 的一部分)。
这些命令之间有什么区别,以及如何更好地排除旧主机名仍然存在的原因。
答案1
hostname
返回配置的主机名或节点名。实际上,它可以是短名称(在大多数配置中)或长名称(在这种情况下通常是 FQDN)。简称由 给出hostname --short
。
hostname --fqdn
返回节点名上的 FQDN gethostbyname
(由uname
系统调用返回,请参阅uname(2)
手册页)。
hostname -A
是一些晦涩且不直观的东西。特别是,尽管有其名称和描述(“所有 FQDN”),但它在设计上并未给出标准 FQDN。因此我会说:不要使用它。原因之一是它错过了机器的有效 IP 地址,例如 127.0.1.1,FQDN 可能在文件中与该地址关联/etc/hosts
(例如,这是目前 Debian 和 Ubuntu 下的默认设置)。该方法的另一个问题hostname -A
是 IP 地址的反向解析不一定会给出 FQDN;它可以只是一个简短的名称。
关于你的 python 问题,可能是那里的一个错误。我不知道。我建议您尝试以下 Perl 脚本:
#!/usr/bin/env perl
use strict;
use POSIX;
my $nodename = (POSIX::uname)[1];
print "Nodename: $nodename\n";
my @ghbn = gethostbyname $nodename;
print "FQDN: $ghbn[0]\n";
$ghbn[0] !~ /\./ && $ghbn[1] =~ /(\S+\.\S+)/
and print "Fixed FQDN from aliases: $1\n";