在 Linux 系统运维和网络配置中,快速准确地获取本机 IP 地址是一项基础且高频的操作。核心上文归纳是:在现代 Linux 发行版中,首选 ip 命令套件进行网络配置和查询,它是 net-tools(如 ifconfig)的官方替代品,功能更强大且数据更精准;若仅需提取 IP 字符串用于脚本自动化,hostname -I 是最高效的选择;若需获取公网 IP,则需借助 curl 访问外部服务。 掌握这些方法不仅能提升运维效率,更能应对复杂的网络环境排查需求。

使用 ip 命令获取 IP 地址(现代标准)
ip 命令属于 iproute2 软件包,是目前 Linux 内核网络栈管理的首选工具,相比于老旧的 ifconfig,它能更直观地展示网络接口状态和路由表信息。
查看所有网络接口的 IP 信息
执行以下命令可以列出系统中所有网络接口的详细信息:
ip addr
或者简写为:
ip a
输出结果中,每一块代表一个网络接口,重点关注 inet 字段,它标识了 IPv4 地址。inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic eth0 表示 eth0 网卡的 IP 地址是 168.1.100。
仅查看特定网卡信息
在服务器配置了多张网卡(如内网和外网)时,查看全部信息显得冗余,可以通过指定网卡名称来精准定位:
ip addr show eth0
此命令仅输出 eth0 的相关信息,便于快速定位目标 IP。
仅显示 IPv4 地址
为了过滤掉 IPv6 地址和冗余的链路层信息,可以使用 -4 参数结合 -o(一行输出)参数:
ip -4 -o addr
这种方式输出的格式非常规整,适合系统管理员快速浏览当前主机的所有 IPv4 绑定情况。
使用 hostname 命令快速提取(脚本利器)
对于编写 Shell 脚本或需要将 IP 地址作为变量传递给其他程序的场景,hostname 命令提供了最简洁的输出方式。
获取所有 IP 地址
执行命令:
hostname -I
该命令会直接输出本机所有配置的 IP 地址,以空格分隔,不包含任何额外的描述性文字,例如输出 168.1.100 10.0.0.5,这是自动化脚本中获取 IP 最推荐的方法,因为它避免了使用 grep 或 awk 进行复杂的文本处理。

获取指定网卡的 IP(结合 ip 命令)
虽然 hostname 很方便,但它无法指定网卡,若需要获取特定网卡的 IP 并用于脚本,建议组合使用 ip 命令与文本处理工具:
ip addr show eth0 | grep 'inet ' | awk '{print $2}' | cut -d/ -f1
这条命令链的含义是:显示 eth0 信息 -> 筛选包含 ‘inet ‘ 的行 -> 提取第二列(IP/掩码) -> 以斜杠为分隔符提取第一列(纯 IP),这种组合拳体现了 Linux 命令行管道处理的强大之处。
使用 ifconfig 命令(传统方法)
尽管 ifconfig 已被标记为“过时”且在许多最小化安装的 Linux 发行版(如 CentOS 7+、Debian 9+)中默认不再预装,但凭借其极简的输出格式,依然是许多老派运维人员的首选。
安装与使用
如果系统提示找不到该命令,通常需要先安装 net-tools 包(例如在 Ubuntu 上使用 sudo apt install net-tools)。
执行命令:
ifconfig
输出结果中,eth0 或 ens33 段落下的 inet addr 即为 IP 地址,注意,ifconfig 默认不会显示处于“down”状态的网卡,而 ip a 可以显示,这是 ip 命令在全面性上的另一个优势。
获取公网 IP 地址
上述方法获取的都是局域网(LAN)内部的私有 IP 地址,在需要进行远程连接、DDNS 动态解析或网络安全审计时,必须获取服务器的公网 IP。
使用命令行查询工具
Linux 本身不存储公网 IP 信息,必须向外部服务器发起请求,最常用的方法是利用 curl 或 wget:
curl ifconfig.me
或者
curl cip.cc
ifconfig.me 会直接返回一个纯文本 IP,极其简洁;而 cip.cc 等国内服务通常会返回 IP、地理位置、运营商等详细信息,更适合进行网络归属地排查。
专业见解:DNS 查询法
在不方便访问 HTTP 端口(如防火墙严格限制)的环境下,可以通过查询 DNS 记录来获取公网 IP:
dig +short myip.opendns.com @resolver1.opendns.com
这种方法利用 OpenDNS 的特殊解析记录,仅通过 DNS 协议(UDP/TCP 53端口)即可获取 IP,绕过了 HTTP 限制,是网络排错中的高级技巧。
常见问题与专业解决方案
在实际操作中,运维人员常会遇到“网卡命名混乱”或“IP 显示不全”的问题。

网卡命名规则的变化
传统的网卡命名为 eth0、eth1,但现代 Linux 系统(特别是 systemd 引入后)采用了“可预测的网络接口命名”规则,如 enp3s0、ens33,这种命名基于 BIOS 提供的插槽位置信息,虽然看起来复杂,但能确保网卡设备名在硬件变更后保持不变,在使用 ip 或 ifconfig 前,建议先执行 ip link 确认当前网卡的准确名称。
无法获取 IP 的排查
如果命令执行后只有 0.0.1(回环地址),说明物理网卡未分配 IP,此时应检查网络服务状态(systemctl status network 或 systemctl status NetworkManager)以及网线连接状态,对于 DHCP 环境,尝试强制重新获取 IP:dhclient eth0。
相关问答
Q1:在 Linux 脚本中,如何将获取到的 IP 地址赋值给一个变量?
A: 推荐使用 hostname -I 结合 read 命令或直接截取。
MY_IP=$(hostname -I | awk '{print $1}')
这行命令将获取到的第一个 IP 地址赋值给变量 MY_IP,使用 awk '{print $1}' 是为了防止机器有多个 IP 时,变量中包含空格或多个 IP,确保变量的纯净性。
Q2:为什么 ifconfig 显示的 IP 是 inet addr:...,而 ip a 显示的是 inet ...?
A: 这是两个工具输出格式的区别。ifconfig 源于 BSD 工具集,习惯使用 inet addr 来标识地址;而 ip 命令源于 Linux 的 IP 路由协议栈工具,其输出格式更接近内核内部的数据结构表示,直接使用 inet 后跟地址和掩码(如 /24),从数据精确度来看,ip a 的输出更利于解析 CIDR(无类别域间路由)格式的掩码信息。
能帮助您全面掌握 Linux 获取 IP 地址的各种技巧,如果您在实际运维中遇到了特殊的网络环境配置问题,或者有更高效的命令组合方式,欢迎在评论区分享您的经验和见解,我们一起交流探讨。

















