hostname -I 最快最稳查本机非回环 IPv4 地址;ifconfig 已过时、不默认安装、输出不稳且无法反映真实作用域;ip addr 是唯一可靠基础命令,推荐 ip -br addr show 或 ip -4 -br addr show 提取纯 IP。

直接看本机所有非回环 IPv4 地址,用 hostname -I 最快、最稳;要查具体网卡或带掩码/作用域等细节,必须用 ip addr(不是 ifconfig)。
为什么别用 ifconfig 查 IP
ifconfig 在 Ubuntu 22.04+、CentOS 8+ 等现代发行版里默认不装,执行会报 command not found;即使装了,它输出格式不统一(比如不同版本对 inet 行的空格/冒号处理不一致),用 grep 或 awk 提取时极易出错。更重要的是,ifconfig 读取的是内核过时的 proc 接口,无法反映真实地址作用域(如 scope global vs scope link),在容器、云主机等场景下常返回错误地址。
- Ubuntu 22.04 默认没
ifconfig,得手动sudo apt install net-tools - CentOS 8+ 同样需
sudo dnf install net-tools,且官方明确标记为“deprecated” - 用
ifconfig eth0 | awk '/inet / {print $2}'在某些系统上会漏掉 IPv4,或误取 IPv6 的inet6行
ip addr show 是唯一可靠的基础命令
ip addr(或简写 ip a)是当前 Linux 内核网络栈的直接接口,输出稳定、字段语义清晰。关键在于怎么过滤——不要硬啃原始输出,用内置选项或简单管道即可。
- 查所有 IPv4 地址(不含 IPv6):
ip -4 addr show - 查某网卡(如
eth0)的 IPv4:ip -4 addr show eth0 - 快速扫视,只看接口名、状态和 IPv4:
ip -br addr show(推荐脚本和人工都用这个) - 提取纯 IP(不含掩码):
ip -4 -br addr show | awk '$3 {print $3}' | cut -d'/' -f1
注意:输出中 inet 192.168.1.100/24 的 /24 是 CIDR 掩码,不是端口;scope global 才是可用的业务 IP,scope link(如 fe80::)不能跨网段通信。
hostname -I 是自动化脚本的首选
如果你只是想在部署脚本、Docker 启动命令或 Ansible 中获取本机主 IP,hostname -I(大写 i)是唯一轻量、无依赖、不报错的选择。它绕过所有网卡枚举逻辑,直接从内核地址列表中挑出所有非回环、全局作用域的 IPv4/IPv6 地址。
- 输出是空格分隔的纯 IP 列表,例如:
192.168.1.100 172.17.0.1 - 不查 DNS、不读
/etc/hosts,不受配置文件污染 - 对比
hostname -i(小写 i):后者依赖/etc/hosts映射,生产环境几乎必然不准 - 在 Kubernetes Pod 或 Docker 容器里也能正常工作,只要网络命名空间有地址
公网 IP 得靠外部服务,和本地命令无关
本地所有命令(ip addr、hostname -I、ifconfig)查到的都是内网地址。要获取公网 IP,必须发 HTTP 请求到第三方服务:
- 最简:
curl -s ifconfig.me(返回纯 IPv4) - 兼容 IPv6:
curl -s icanhazip.com - 带超时和备用源(防单点失败):
curl -m 3 -s ifconfig.me || curl -m 3 -s icanhazip.com
别用 ip route get 1.1.1.1 | awk '{print $7}' 这类“技巧”——它返回的是默认路由出口网卡的本地地址,不是公网 IP,NAT 后完全无效。
真正容易被忽略的是:云服务器(如阿里云、AWS)的“公网 IP”实际是 NAT 映射,本地根本查不到;而 hostname -I 返回的可能是 VPC 内网地址,不是你绑的那个弹性公网 IP。这时候只能查云厂商 API 或控制台。


















