主机名、主机名 --fqdn 和主机名 -A 之间有什么区别

Jus*_*son 6 networking rhel hostname

我有一台我更改了主机名的机器。我改变了它/etc/hosts/etc/sysconfig/network以及与hostname命令。hostname返回正确的短名称,hostname --fqdn返回预期的 FQDN,但hostname -A返回旧名称。我更改了机器的 IP 地址以确保它不是外部 DNS 缓存。

如果我打开 python 并运行

import socket
print(socket.gethostname())
print(socket.getfqdn())
Run Code Online (Sandbox Code Playgroud)

两者都返回旧的主机名/fqdn,与 hostname -A

从主机名手册页看来--fqdn,它只需要短名称和域并将它们放在一起。

显示 FQDN(完全限定域名)。FQDN 由短主机名和 DNS 域名组成。除非您使用 bind 或 NIS 进行主机查找,否则您可以更改 /etc/hosts 文件中的 FQDN 和 DNS 域名(它是 FQDN 的一部分)。

这些命令之间有什么区别,我如何更好地解决旧主机名仍然存在的原因。

vin*_*c17 7

hostname返回配置的主机名或节点名。实际上,它可以是短名称(在大多数配置中)或长名称(在这种情况下通常是 FQDN)。短名称由 给出hostname --short

hostname --fqdn返回gethostbyname节点名上的 FQDN (由uname系统调用返回,请参见uname(2)手册页)。

hostname -A是一些晦涩和不直观的东西。特别是,尽管它的名称和描述(“所有 FQDN”),它在设计上并没有提供标准的 FQDN。因此我会说:不要使用它。一个原因是它错过了机器的有效 IP 地址,例如 127.0.1.1,FQDN 可能与/etc/hosts文件中的 FQDN 相关联(例如,这是当前在 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";
Run Code Online (Sandbox Code Playgroud)

  • @Rothgar `hostname -A` 查看配置的接口并反向解析它们(好吧,这是其手册页中给出的信息)。127.0.1.1 在我的回答中是正确的 IP 地址,而不是 127.0.0.1。127.0.1.1 用于 FQDN(而不是 127.0.0.1)是导致`hostname -A` 问题的原因之一。 (2认同)