结论是ip a最稳妥、hostname -i最快,ifconfig在新系统中常因未预装而报错;ip a属现代标准工具,准确反映内核配置,hostname -i专用于快速输出所有活跃ipv4地址,而ifconfig和nmcli存在兼容性与覆盖范围局限。

直接看结论:用 ip a 最稳妥,hostname -I 最快,别再默认敲 ifconfig——它在新系统里大概率报 command not found。
为什么 ip a 是首选
ip 属于 iproute2 工具集,是现代 Linux 的网络事实标准。它不依赖 NetworkManager,能准确反映内核实际配置,且输出结构清晰、可脚本化强。
- 输出中每块接口以编号开头(如
2: eth0:),找含inet的行,后面跟着的就是 IPv4 地址(例如inet 192.168.1.23/24) - 若只关心主网卡,可加过滤:
ip -4 a show eth0 | grep -oP 'inet \K[\d.]+' - 不要依赖
lo(回环)或docker0等虚拟接口的inet行——它们不是你对外通信的真实地址 -
ip a默认显示 IPv4 和 IPv6,加-4或-6可限定协议
hostname -I 适合什么场景
这个命令专为“快速获取所有活跃 IPv4 地址”设计,输出就是一串空格分隔的 IP,没有多余字段,非常适合写进 shell 脚本或一键调试。
- 它只返回已启用、有 IPv4 地址的非回环接口(
lo被自动排除) - 如果输出为空,说明系统没拿到任何 IPv4 地址——不是命令错了,而是 DHCP 没响应、网线没插、或者
systemd-networkd配置失败 - 注意大小写:
hostname -i(小写 i)返回的是主机名解析出的首个 IP,可能指向127.0.1.1,不可靠;必须用大写-I
哪些命令容易踩坑
ifconfig 和 nmcli 看似直观,但限制多、行为不一致。
-
ifconfig在 Ubuntu 22.04+、Rocky 9、openEuler 等新系统中默认不安装,装了也只显示“已启用”接口,对 NetworkManager 管理的连接可能漏掉 DHCP 分配的地址 -
nmcli device show看起来很全,但它只显示 NetworkManager 当前管理的活跃连接;如果系统用systemd-networkd或纯静态配置,这里可能完全空白 -
ip route | grep src这类“间接查法”依赖默认路由存在,多网卡或策略路由环境下结果不可信
复杂点在于:Linux 没有唯一“本机 IP”的概念——一个机器可以有多个网卡、多个地址、IPv4/IPv6 并存、甚至同一接口绑多个 IP。真正该问的不是“我的 IP 是多少”,而是“我要用哪个接口连哪台机器?那个路径上实际生效的源地址是什么”。ip a 给你原始数据,hostname -I 给你最常用答案,剩下的得结合你的网络拓扑来判断。











