为什么“hostname --fqdn”在我的 Ubuntu 电脑上不起作用?

为什么“hostname --fqdn”在我的 Ubuntu 电脑上不起作用?

我正在使用 Ubuntu 10.04 LTS,当我输入命令时hostname --fqdn,我收到消息:hostname: Name or service not known

因此,我无法global成功安装,并且在尝试时出现以下错误:

Setting up global (5.7.1-1) ...
hostname: Name or service not known
dpkg: error processing global (--configure):
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 global
E: Sub-process /usr/bin/dpkg returned an error code (1)

/etc/nsswitch.conf的如下。

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

有人知道这意味着什么以及我该如何解决这个问题吗?

答案1

您能提供一下内容吗/etc/nsswitch.conf

看起来 /etc/nsswitch.conf 中的“hosts”行的值不正确。它以“files”开头吗?

否则,可以通过编辑 /etc/hosts 并将 FQDN 放在主机名出现的行上来设置 FQDN。假设您有一个主机名“foo”,并且您找到一行:

127.0.0.1 foo

您可以像这样编辑它:

127.0.0.1 foo.localdomain foo

foo.localdomain将是您的新 FQDN。

答案2

编辑 /etc/hosts 以添加您的 FQDN

有关语法的信息位于此处: http://www.faqs.org/docs/securing/chap9sec95.html

更新:再次阅读您的问题,听起来几乎像是您没有正确设置路径,或者是主机名程序有问题。

执行'哪个主机名'

它应该返回路径“/bin/hostname”

如果有效,再次尝试该命令,例如,

‘/bin/主机名 --fqdn’

答案3

与简单的hostname命令调用不同,该调用hostname --fqdn将尝试执行更多操作,这通常会导致一些 DNS 查找。

以以下(成功)调用为例(这是来自 Red Hat 6 框,它具有来自“net-tools”包的“hostname”;较新的机器,例如 RHEL7,具有不同的实现,缺少 --verbose 选项):

# hostname --fqdn --verbose
gethostname()=`myserver.example.com'
Resolving `myserver.example.com' ...
Result: h_name=`myserver.example.com'
Result: h_addr_list=`10.1.2.3'
myserver.example.com

请注意非常有用的--verbose选项。

简而言之,除了简单之外的任何方法都hostname可能比你预期的要好。下面是另一个示例:

# hostname --ip --verbose
gethostname()=`myserver.example.com'
Resolving `myserver.example.com' ...
Result: h_name=`myserver.example.com'
Result: h_addr_list=`10.1.2.3'
10.1.2.3

最后总结一下:

# hostname --verbose
gethostname()=`myserver.example.com'
myserver.example.com

请注意,系统的主机名(由 gethostname 返回)可以是非限定主机名,例如只是“myserver”。这就是您要安装的程序使用的原因hostname --fqdn

错误信息hostname: Name or service not known来自解析器函数:这些是系统库的一部分,用于在名称和地址(通常是 DNS 名称和 IP 地址)之间进行转换。

实际上,解析器所做的不仅仅是 DNS(也不仅仅是在主机名和 IP 地址之间进行转换);它的行为部分由文件配置/etc/nsswitch.conf,通常它将查阅以下内容,通常按以下顺序:

  • ‘hosts’(在 Linux 上,指的是 /etc/hosts)
  • (有时)nscd(名称服务缓存守护进程)
  • ‘dns’

(请注意,您还可以拥有一个缓存 DNS 服务器,例如 dnsmasqd --- 就上述观点而言,这仍然属于“dns”机制)。

值得指出的是,诸如主持人和尊贵的nslookup不要遵循此顺序;它们是显式 DNS 查询工具。这意味着如果您依赖它们(例如在脚本中),您最终可能会得到与常规客户端程序(使用系统解析器)不同的结果。因此,使用盖特恩脚本中的程序,特别是当您有一个正在运行的缓存组件(如 nscd)时。

# getent hosts myserver.example.com
10.1.2.3    myserver.example.com

因此,这里的关键点是:a)如果您已经在 /etc/hosts 中为您自己的机器配置了条目,并且 b)您的 /etc/nsswitch.conf 具有通常的配置 --hosts: files dns按照这个顺序,那么 c)即使您的环境中没有很好地配置 DNS,也hostname --fqdn应该可以工作。

在配置良好的 DNS 中,您应该有一个“反向”地址(“PTR 记录”),它提供服务器的“规范”名称,并且该名称也应该能够被查找(IPv4 的“A 记录”)。

简短版本:(适用于 RHEL6 及类似版本)添加--verbose; 它会指出您缺少什么。对于较新的平台,您可能只需要手动进行反向和正向查找。

希望这能帮助您了解发生了什么。

相关内容