hostname 命令详解与参数实测(Ubuntu 22.04)

实测 Ubuntu 22.04 的 hostname:默认/-s/-f/-d/-i/-I/-y/-b/-A/-a 全参数,/etc/hosts 配置 FQDN 前后两态对照与还原核验,改名所需的内核权能边界、/etc/hostname 持久化机制,附绑定挂载环境 sed -i 报错的覆写替代方案。

Linux命令Linux系统UbuntuUbuntu 22.04命令行系统信息2026/10/15

hostname 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 hostname 的每一个常用参数——默认显示、-s 短名、-f FQDN 与 /etc/hosts 的联动(无条目回落与有条目返回两态)、-d 域名、-i/-I IP 地址、-y NIS 域名、-b 引导语义、改名所需的内核权能边界与 /etc/hostname 持久化机制,全部命令与回显已在 Ubuntu 22.04(hostname 3.23)实测通过。

一、环境信息

本章记录实测环境的操作系统、内核与软件包版本,保证文中所有回显可追溯、可复现。以下信息均为在实测机上真实采集。

  • 操作系统:Ubuntu 22.04.5 LTS(取自 /etc/os-release,实测见下)
  • 内核版本:6.8.0-138-generic(uname -r 实测)
  • 硬件架构:x86_64(uname -m 实测)
  • 本机主机名:f1034b9326b2(hostname / uname -n 实测,云主机默认随机节点标识)
  • 本机地址:172.17.0.2(hostname -I 实测)
  • 工具版本:hostname 3.23(软件包 hostname 3.23ubuntu2,hostname -V 实测)
  • 演示数据目录:/root/demo/hostname/(本文落盘与备份文件均在此目录,实测创建)

环境基线采集命令与实测回显:

head -2 /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
dpkg -l hostname | tail -1
ii  hostname       3.23ubuntu2  amd64        utility to set/show the host name or domain name

💡 说明:hostname 是独立软件包(非 coreutils),Ubuntu 22.04 base 系统自带;coreutils 系的 uname/arch/nproc 版本为 8.32,hostname 版本号独立演进,本机为 3.23。

二、命令概览

2.1 语法与测试数据

hostname 用于显示或设置内核的主机名,还能借助名称解析给出 FQDN(完全限定域名)、DNS 域名与本机 IP 地址。它是"读 + 写"双能力命令:读主机名全家桶,写主机名(需要内核授权,实测见 3.10)。

官方语法(来自 --help 前几行,完整帮助见 2.2):

Usage: hostname [-b] {hostname|-F file}         set host name (from file)
       hostname [-a|-A|-d|-f|-i|-I|-s|-y]       display formatted name
       hostname                                 display host name

即三种形态:hostname [-b] 新名字(或 -F 文件)用于设置;hostname [显示参数] 用于格式化显示;裸 hostname 显示主机名。同一二进制还以 dnsdomainname(= hostname -d)、ypdomainname/nisdomainname/domainname(= hostname -y)的别名链接形式提供。

本文测试数据约定:

  • 全部演示输出均在上述环境(Ubuntu 22.04.5 LTS / 主机名 f1034b9326b2 / 地址 172.17.0.2)实测采集;
  • 涉及 /etc/hosts 的 FQDN 演示采用"备份 → 覆写 → 实测 → 还原 → diff 核验"流程(实测全过程见 3.3 与 4.1);
  • 落盘与备份目录 /root/demo/hostname/。

参数速查表(每项实测值均来自第三章):

参数长参数语义本机实测
(无参数)—显示主机名f1034b9326b2
-s--short短主机名f1034b9326b2
-f--fqdn, --longFQDN 完全限定名无 FQDN 条目回落为短名;配置后 f1034b9326b2.example.com
-d--domainDNS 域名未配置空输出;配置后 example.com
-i--ip-address主机名解析到的地址172.17.0.2
-I--all-ip-addresses本机全部网络地址172.17.0.2
-y--yp, --nisNIS 域名(废弃体系)Local domain name not set,rc=1
-b--boot引导兜底设置主机名已设置时无操作
-A--all-fqdns全部 FQDN配置后 f1034b9326b2.example.com
-a--alias别名(NIS 体系)f1034b9326b2
新名字—改主机名本环境被内核拒绝,rc=1(见 3.10)

关键差异:hostname 直接读内核节点名;-f/-d/-i 依赖名称解析(/etc/hosts 或 DNS);-I 枚举网卡地址,与解析无关。这三类数据源决定了"改 /etc/hosts 能改 FQDN 但不能改主机名本身"的行为分野。

2.2 --help 全量输出(逐行照抄)

以下为 hostname --help 的完整实测回显,逐行照抄未删减:

hostname --help
Usage: hostname [-b] {hostname|-F file}         set host name (from file)
       hostname [-a|-A|-d|-f|-i|-I|-s|-y]       display formatted name
       hostname                                 display host name

       {yp,nis,}domainname {nisdomain|-F file}  set NIS domain name (from file)
       {yp,nis,}domainname                      display NIS domain name

       dnsdomainname                            display dns domain name

       hostname -V|--version|-h|--help          print info and exit

Program name:
       {yp,nis,}domainname=hostname -y
       dnsdomainname=hostname -d

Program options:
    -a, --alias            alias names
    -A, --all-fqdns        all long host names (FQDNs)
    -b, --boot             set default hostname if none available
    -d, --domain           DNS domain name
    -f, --fqdn, --long     long host name (FQDN)
    -F, --file             read host name or NIS domain name from given file
    -i, --ip-address       addresses for the host name
    -I, --all-ip-addresses all addresses for the host
    -s, --short            short host name
    -y, --yp, --nis        NIS/YP domain name

Description:
   This command can get or set the host name or the NIS domain name. You can
   also get the DNS domain or the FQDN (fully qualified domain name).
   Unless you are using bind or NIS for host lookups you can change the
   FQDN (Fully Qualified Domain Name) and the DNS domain name (which is
   part of the FQDN) in the /etc/hosts file.

逐项解读:

  • Usage 前三行给出"设置 / 格式化显示 / 裸显示"三种形态;
  • Program name: 段说明 dnsdomainname、domainname 等命令实际是 hostname 的别名链接(dnsdomainname=hostname -d);
  • Description 末尾三句是 FQDN 机制的官方口径:不使用 bind/NIS 做名称解析时,FQDN 与 DNS 域名可以直接在 /etc/hosts 文件里修改——这正是 3.3 两态实测的依据;
  • -a(alias)与 -y(NIS)属于 NIS 体系的遗留参数,现代系统上基本取不到值(实测见 3.7/3.9)。

2.3 版本信息

实测 hostname -V:

hostname -V
hostname 3.23

💡 说明:-V(大写)是 hostname 的版本参数;hostname --version 与 -V 等价,帮助原文亦标明 hostname -V|--version|-h|--help。

💡 技术拓展:查看/设置主机名有三类入口,横向对比——

工具数据源与依赖读写持久化能力
hostname内核节点名 + /etc/hosts 等解析主机名 / FQDN / 域名 / IP可写(需内核权能)无(临时,重启失效;持久化需写 /etc/hostname)
hostnamectlsystemd-hostnamed 服务主机名 + 系统版本 + 内核一览可写有(自动写入 /etc/hostname)
uname -n内核节点名仅节点名不可写无

本文主角 hostname 覆盖"读全家桶 + 临时改名";需要开机持久化主机名,systemd 主机上首选 hostnamectl,或手动写 /etc/hostname(机制实测见 3.11)。

三、参数逐项实测

本章逐个参数实测:每个参数给出实测命令、真实回显与要点说明。涉及 /etc/hosts 的两态实测均在"备份 → 修改 → 实测 → 还原 → diff 核验"保护流程下完成。

3.1 无参数(显示主机名)

裸调用显示当前内核节点名。实测:

hostname
f1034b9326b2

💡 要点:无参数即"显示"形态;与 uname -n 同源(对照实测见 3.12),但 hostname 还能设置、还有全家桶显示参数。

3.2 -s(--short)短主机名

输出短主机名(主机名中第一个点之前的部分)。实测:

hostname -s
f1034b9326b2

💡 要点:本机主机名本身不含点,-s 与裸输出一致;当 FQDN 形态为 demo.example.com 时,-s 输出 demo。日志打标、提示符拼接常用短名。

3.3 -f(--fqdn)FQDN 完全限定名:两态实测

-f 输出 FQDN,其值由名称解析决定。帮助原文明确:使用 /etc/hosts 解析时,FQDN 就配置在 /etc/hosts 里。

状态一:/etc/hosts 无 FQDN 条目(本机初始状态)。 先看 /etc/hosts 现状,主机条目没有域名部分:

cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::  ip6-localnet
ff00::  ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      f1034b9326b2

此时 -f 的回落行为实测——解析不到域名部分,返回主机名本身,rc=0:

hostname -f; echo rc=$?
f1034b9326b2
rc=0

状态二:给 /etc/hosts 配置 FQDN 条目后。 按"IP FQDN 短名"的条目格式覆写主机行(先备份,实测命令):

cp /etc/hosts /root/demo/hostname/hosts.bak
printf '127.0.0.1\tlocalhost\n::1\tlocalhost ip6-localhost ip6-loopback\nfe00::\tip6-localnet\nff00::\tip6-mcastprefix\nff02::1 ip6-allnodes\nff02::2 ip6-allrouters\n172.17.0.2\tf1034b9326b2.example.com f1034b9326b2\n' > /etc/hosts
cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::  ip6-localnet
ff00::  ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      f1034b9326b2.example.com f1034b9326b2

再次实测 -f,返回完整 FQDN:

hostname -f; echo rc=$?
f1034b9326b2.example.com
rc=0

实测后立即还原并核验(还原后 -f 恢复回落行为):

cp /root/demo/hostname/hosts.bak /etc/hosts
diff /etc/hosts /root/demo/hostname/hosts.bak && echo "hosts 已还原:与备份逐字一致"
hostname -f; echo rc=$?
hosts 已还原:与备份逐字一致
f1034b9326b2
rc=0

💡 要点:-f 不是"读配置文件里的域名",而是解析当前主机名得到的规范名。/etc/hosts 条目格式必须为 IP FQDN 短名(规范名在前、别名在后),只写短名时 -f 回落为短名本身,不报错。

3.4 -d(--domain)DNS 域名:两态实测

-d 输出 FQDN 中的域名部分(第一个点之后的内容)。

状态一(未配置域名):实测输出为空,rc=0:

hostname -d; echo rc=$?
rc=0

状态二(/etc/hosts 已配置 FQDN,同 3.3 状态二):实测输出域名部分:

hostname -d; echo rc=$?
example.com
rc=0

💡 要点:hostname -d 等价于别名命令 dnsdomainname(见 2.2 帮助 Program name 段);未配置域名时空输出不报错,脚本里直接判空即可。

3.5 -i(--ip-address)主机名解析地址

输出当前主机名解析到的 IP 地址。实测:

hostname -i; echo rc=$?
172.17.0.2
rc=0

-i 走名称解析:本机主机名 f1034b9326b2 在 /etc/hosts 中对应 172.17.0.2(见 3.3 状态一的条目)。若主机名同时在 DNS 与 /etc/hosts 出现,结果取决于 /etc/nsswitch.conf 的解析顺序。

💡 要点:-i 解析的是"主机名",依赖解析库;解析失败时 rc 非 0 并报错。要在脚本里拿"本机 IP",优先 -I(见 3.6),它不依赖名称解析。

3.6 -I(--all-ip-addresses)本机全部网络地址

输出本机所有网络接口上的 IPv4 地址(不含回环),空格分隔。实测:

hostname -I; echo rc=$?
172.17.0.2
rc=0

💡 要点:-i 与 -I 一字之差:-i 解析主机名(/etc/hosts 或 DNS 给什么就是什么,可能多条);-I 枚举本机网卡实际配置的全部地址,多网卡主机输出形如 10.0.0.5 192.168.1.5。本机单网卡,两者同为 172.17.0.2。

3.7 -y(--yp, --nis)NIS 域名(废弃体系)

输出 NIS/YP 域名。NIS 是已废弃的旧式集中认证/名称服务体系,现代系统未配置。实测:

hostname -y; echo rc=$?
hostname: Local domain name not set
rc=1

💡 要点:未设置 NIS 域时报 Local domain name not set 且 rc=1;ypdomainname/nisdomainname/domainname 三个别名命令与 hostname -y 等价(见 2.2 帮助)。新系统无需投入 NIS,此参数了解即可。

3.8 -b(--boot)引导兜底语义

-b 是给系统启动脚本用的兜底参数:配合新名字或 -F 文件 设置主机名时"总是执行、已设置不报错";不带名字时若主机名未设置(空/localhost)则尝试兜底。本机主机名已设置,实测行为:

hostname -b; echo rc=$?
f1034b9326b2
rc=0

随后确认主机名未被改动:

hostname
f1034b9326b2

💡 要点:主机名已设置时 -b 是无操作(回显当前名、rc=0、值不变),这正是启动脚本想要的安全语义——无论引导执行多少遍都不会把主机名改坏。

3.9 -A(--all-fqdns)与 -a(--alias)

-A 输出本机全部 FQDN(空格分隔,来自对所有地址的解析);-a 输出 NIS 别名。以下为 /etc/hosts 已配置 FQDN 条目状态下(同 3.3 状态二)的实测:

hostname -A; echo rc=$?
f1034b9326b2.example.com
rc=0
hostname -a; echo rc=$?
f1034b9326b2
rc=0

💡 要点:-A 与 -f 的区别在于"枚举全部":多网卡多解析条目时 -A 可能输出多个 FQDN;-a 的别名同样来自解析条目(本机条目 IP FQDN 短名 中的短名被识别为别名),NIS 体系外用途有限。

3.10 改主机名:hostname 新名字 与权限边界

hostname 新名字 调用内核 sethostname 修改运行中的主机名。该操作需要内核权能(CAP_SYS_ADMIN),在权限完整的 Ubuntu 服务器上以 root 执行即时生效,重启后失效(持久化见 3.11)。

本实测环境的运行权限被裁剪,实测该操作被内核拒绝(root 身份、回显与退出码如实记录):

id -u
0
hostname tmp-probe-name; echo rc=$?
hostname: you must be root to change the host name
rc=1

定位依据:即使 uid=0,进程仍受内核权能边界约束,实测边界集不含改主机名所需的 CAP_SYS_ADMIN(第 21 位):

grep '^CapBnd' /proc/self/status
CapBnd: 00000000a80425fb

💡 要点:在受限运行环境(权限裁剪的托管/沙箱场景)里,hostname 改名 会以 rc=1 失败且提示"you must be root"——这不是 uid 问题而是权能问题。标准 Ubuntu 22.04 服务器上,改名流程为:hostname 新名字(临时生效)→ uname -n 或 hostname 验证(同一数据源会同步变化)→ 需要持久化再写 /etc/hostname 或用 hostnamectl。

3.11 /etc/hostname 与持久化机制

/etc/hostname 是开机时设置主机名的数据源:一行一个名字,系统启动(systemd 系由 systemd-hostnamed)读取它并设置内核节点名。hostname 新名字 只改内核运行态、不会写这个文件——这是"临时改名重启失效"的原因。

实测文件当前内容:

cat /etc/hostname
f1034b9326b2

写入机制的演示(备份 → 写入 demo-server → 回读 → 立即还原 → 核验):

cp /etc/hostname /root/demo/hostname/hostname.bak
echo "demo-server" > /etc/hostname
cat /etc/hostname
demo-server
cp /root/demo/hostname/hostname.bak /etc/hostname
cat /etc/hostname
f1034b9326b2

💡 要点:持久化改名的完整姿势是"两步一起做":echo 新名字 > /etc/hostname(写持久化数据源)+ hostname 新名字(让运行态立即生效,需权能);systemd 主机上 hostnamectl set-hostname 新名字 一条命令同时完成两件事。

3.12 与 uname -n 对照(同源验证)

hostname 与 uname -n 读的是内核里同一份节点名数据。实测:

hostname
f1034b9326b2
uname -n
f1034b9326b2

两者输出完全一致。差异在能力:uname -n 只读;hostname 可写(改名后 uname -n 同步变化,因同一数据源),且提供 -f/-d/-i/-I 等解析型参数。

💡 要点:跨平台脚本(需兼容非 Linux 系统)取主机名用 uname -n 更通用;Linux 运维场景 hostname 的功能面更全。

四、实战示例

本章给出 4 个组合场景,覆盖 FQDN 配置全流程、巡检一行、日志标注与落盘,全部实测通过。演示数据统一落盘到 /root/demo/hostname/。

4.1 FQDN 配置全流程(备份 → 覆写 → 验证 → 还原)

生产机上把裸主机名补全为 FQDN 的标准操作流,全程带备份与还原核验。第一步备份并覆写 /etc/hosts(条目格式 IP FQDN 短名):

cp /etc/hosts /root/demo/hostname/hosts.bak
printf '127.0.0.1\tlocalhost\n::1\tlocalhost ip6-localhost ip6-loopback\nfe00::\tip6-localnet\nff00::\tip6-mcastprefix\nff02::1 ip6-allnodes\nff02::2 ip6-allrouters\n172.17.0.2\tf1034b9326b2.example.com f1034b9326b2\n' > /etc/hosts
cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::  ip6-localnet
ff00::  ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      f1034b9326b2.example.com f1034b9326b2

第二步验证三件套(FQDN / 域名 / 短名):

hostname -f; hostname -d; hostname -s
f1034b9326b2.example.com
example.com
f1034b9326b2

第三步还原并核验:

cp /root/demo/hostname/hosts.bak /etc/hosts
diff /etc/hosts /root/demo/hostname/hosts.bak && echo "hosts 已还原:与备份逐字一致"
hosts 已还原:与备份逐字一致

说明:生产环境做完第一、二步后保留配置即可(不执行第三步);本组演示按实验纪律完整还原。

4.2 巡检一行:主机名 / FQDN / IP 三合一

巡检脚本用一行输出机器身份三要素:

echo "主机:$(hostname) / FQDN:$(hostname -f) / IP:$(hostname -I)"
主机:f1034b9326b2 / FQDN:f1034b9326b2 / IP:172.17.0.2

解读:本机未配置 FQDN,-f 回落为短名(两态行为见 3.3);配置后该位置会自动变成完整 FQDN,脚本无需修改。

4.3 日志与备份标注短主机名

备份、发布类脚本的日志行带短主机名,便于多机日志归并:

echo "备份完成于 $(hostname -s)" > /root/demo/hostname/backup-note.txt && cat /root/demo/hostname/backup-note.txt
备份完成于 f1034b9326b2

4.4 节点名落盘存档

巡检交付时把节点名写入档案文件:

uname -n > /root/demo/hostname/nodename.txt && cat /root/demo/hostname/nodename.txt
ls -l /root/demo/hostname/
f1034b9326b2
total 12
-rw-r--r-- 1 root root  13 Oct 15 14:13 hostname.bak
-rw-r--r-- 1 root root 172 Oct 15 14:13 hosts.bak
-rw-r--r-- 1 root root  13 Oct 15 14:13 nodename.txt

说明:hosts.bak 与 hostname.bak 是 3.3/3.11 两态实测的还原备份,留档备查。

五、注意事项与常见问题

Q1:以 root 执行 hostname 新名字 却报 "you must be root to change the host name"? 这不是 uid 问题而是内核权能问题:sethostname 需要 CAP_SYS_ADMIN 权能,本实测环境的权能边界集实测不含该位(CapBnd: 00000000a80425fb,见 3.10),即便 root 也被拒绝且 rc=1。标准 Ubuntu 22.04 服务器上 root 直接执行即可生效;如遇此报错,先确认运行环境的权能裁剪策略。

Q2:hostname -f 为什么返回短名而不是 FQDN? -f 是解析行为不是读取行为:/etc/hosts 中主机条目只有短名(如 172.17.0.2 f1034b9326b2)时,解析不到域名部分就回落为短名本身(实测 rc=0 不报错,见 3.3 状态一)。按 IP FQDN 短名 格式书写条目后,-f 即返回完整 FQDN(见 3.3 状态二)。DNS 环境则由 DNS 记录决定。

Q3:临时改名重启后会丢吗?/etc/hostname 和 hostname 命令什么关系? 会丢。hostname 新名字 只改内核运行态;/etc/hostname 是开机设置主机名的数据源,改名命令不会写它(写入机制实测见 3.11)。持久化 = 写 /etc/hostname + 改运行态两步;systemd 主机上 hostnamectl set-hostname 一条命令等效完成。

Q4:-i 和 -I 有什么区别? -i 解析"主机名"得到地址(依赖 /etc/hosts 或 DNS,多条解析会全部列出);-I 枚举本机所有网卡上的 IPv4 地址(不含回环,不依赖解析)。要"本机真实 IP"用 -I,要"别人通过主机名解析到什么"用 -i(两者实测均为 172.17.0.2,见 3.5/3.6)。

Q5:sed -i 修改 /etc/hosts 报 "Device or resource busy"? 在以绑定挂载方式提供 /etc/hosts 的托管环境里(本实测环境如此),sed -i 的"临时文件 + 重命名"策略会失败,实测报错:

sed: cannot rename /etc/sedSanFWt: Device or resource busy

替代写法是直接覆写(truncate + write,不涉及重命名):printf '...' > /etc/hosts,实测成功(见 3.3/4.1)。操作前务必备份,改完 diff 核验。

Q6:hostname 与 uname -n 该用哪个? 读主机名两者完全同源、输出一致(实测见 3.12)。选型:只读且要跨 Unix 平台用 uname -n;需要改主机名、查 FQDN/域名/IP,用 hostname(配合 hostnamectl 做持久化)。

Q7:-y 报 "Local domain name not set" 是故障吗? 不是。NIS(黄页)是已废弃的旧式名称服务体系,现代系统不会配置 NIS 域,hostname -y 实测报此提示且 rc=1(见 3.7)。脚本中不要依赖 -y;同样属于 NIS 遗留的还有 -a 别名查询,取值来自解析条目,实用场景极少。

六、参考链接