在Linux系统中,获取本机IP地址是日常运维和开发中常见的操作,其方法因需求场景(如查看内网IP、公网IP、特定网卡IP等)而异,本文将系统介绍多种获取IP地址的命令及使用场景,涵盖传统工具与现代化方案,并结合实例说明,帮助用户根据实际需求选择合适的方法。

基础命令:查看网络接口与IP地址
Linux中IP地址的获取通常通过网络接口配置信息实现,核心工具包括ip命令、ifconfig命令等,其中ip命令是现代Linux系统(如CentOS 7+、Ubuntu 18.04+)的推荐工具,ifconfig则多用于旧系统或兼容场景。
ip命令:现代网络配置工具
ip命令是iproute2套件的核心工具,用于取代传统的ifconfig,功能更强大,支持更丰富的网络参数配置与查询,其基本语法为ip [选项] 对象 {命令 | help},获取IP地址主要通过ip addr或ip a(简写形式)实现。
基本用法:
ip addr
或简写:

ip a
输出解析:
执行命令后,系统会列出所有网络接口的详细信息,包括接口名称(如eth0、ens33、lo)、MAC地址、IPv4地址、IPv6地址等,以下是一个典型输出示例:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:12:34:56 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fe12:3456/64 scope link
valid_lft forever preferred_lft forever
- 接口名称:
lo为回环接口(本地测试使用),eth0为以太网接口(名称可能因系统或虚拟化技术不同,如ens33、enp0s3等)。 - IPv4地址:
inet后跟随的是IPv4地址及子网掩码(如168.1.100/24,/24表示子网掩码255.255.255.0)。 - IPv6地址:
inet6后跟随的是IPv6地址(如fe80::216:3eff:fe12:3456/64)。
常用进阶选项:
- 指定接口查看:若只需查看特定接口(如
eth0)的IP,可结合grep过滤:ip addr show eth0
或简写:
ip a show eth0
- 仅显示IPv4地址:通过
grep和awk提取关键信息:ip a | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1输出结果为所有接口的IPv4地址(每行一个),如:
(图片来源网络,侵删)0.0.1 192.168.1.100 - 仅显示非回环接口的IPv4地址:过滤掉
lo接口:ip a | grep 'inet ' | grep -v 'lo' | awk '{print $2}' | cut -d'/' -f1
ifconfig命令:传统网络工具
ifconfig是net-tools套件中的工具,曾在Linux系统中广泛使用,但部分现代发行版(如Ubuntu 22.04+、CentOS 9+)默认不再安装,需手动安装(sudo apt install net-tools或sudo yum install net-tools)。
基本用法:
ifconfig
输出解析:
输出结构与ip addr类似,但格式略有不同,以下是一个典型示例:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::216:3eff:fe12:3456 prefixlen 64 scopeid 0x20<link>
ether 00:16:3e:12:34:56 txqueuelen 1000 (Ethernet)
RX packets 12345 bytes 1234567 (1.2 MB)
TX packets 6789 bytes 789012 (789.0 KB)
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.255.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
TX packets 0 bytes 0 (0.0 B)
- IPv4地址:
inet后直接跟随IP地址,netmask为子网掩码(如255.255.0)。 - 接口状态:
flags=4163<UP,BROADCAST,RUNNING,MULTICAST>中UP表示接口已启用。
常用进阶选项:
- 指定接口查看:
ifconfig eth0
- 仅显示IPv4地址:
ifconfig | grep 'inet ' | awk '{print $2}'输出结果为所有接口的IPv4地址(每行一个),如:
168.1.100 127.0.0.1
查看公网IP地址
上述方法获取的是内网IP(私有IP),若需获取本机在互联网中的公网IP(如路由器分配的动态IP或服务器弹性IP),需通过外部服务查询,常用方法包括curl、wget等命令访问第三方API。
使用curl命令
curl是常用的命令行工具,支持HTTP、HTTPS等协议,可通过访问提供公网IP查询的网站获取IP。
常用API及用法:
-
ipinfo.io(返回JSON格式,含IP、位置等信息):
curl ipinfo.io
输出示例:
{ "ip": "203.0.113.100", "hostname": "example.com", "city": "Beijing", "region": "Beijing", "country": "CN", "loc": "39.9042,116.4074", "org": "AS12345 Example ISP" }若仅需IP地址,可结合
jq工具解析JSON(需提前安装jq:sudo apt install jq或sudo yum install jq):curl ipinfo.io | jq -r '.ip'
-
ifconfig.me(返回纯文本IP):
curl ifconfig.me
输出为纯文本IP,如:
0.113.100 -
ip.sb(支持IPv4/IPv6,返回纯文本):
curl ip.sb
或指定IPv6:
curl -6 ip.sb
使用wget命令
wget是另一种常用的下载工具,若系统未安装curl,可通过wget实现类似功能。
基本用法:
wget -qO- ifconfig.me
-q:安静模式,不输出下载进度。-O-:将输出重定向到标准输出(屏幕)。
输出结果为纯文本公网IP,如:
0.113.100
其他辅助工具与场景化方法
hostname命令:查看主机名与IP关联
hostname命令可查看或设置主机名,通过-I选项可快速获取本机所有非回环接口的IP地址(IPv4/IPv6)。
用法:
hostname -I
输出示例(多个IP以空格分隔):
168.1.100 10.0.0.200 fe80::216:3eff:fe12:3456
若仅需IPv4,可结合awk处理:
hostname -I | awk '{print $1}'
nmcli命令:NetworkManager命令行工具
对于使用NetworkManager管理网络的系统(如Ubuntu Desktop、Fedora),nmcli可查看网络连接状态及IP信息。
基本用法:
nmcli device show
输出示例:
GENERAL.DEVICE: eth0
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 00:16:3E:12:34:56
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected)
GENERAL.CONNECTION: Wired connection 1
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/1
IP4.ADDRESS[1]: 192.168.1.100/24
IP4.GATEWAY: 192.168.1.1
IP4.DNS[1]: 8.8.8.8
IP4.DNS[2]: 8.8.4.4
IP6.ADDRESS[1]: fe80::216:3eff:fe12:3456/64
IP6.GATEWAY: --
若仅需查看IPv4地址,可过滤:
nmcli device show | grep 'IP4.ADDRESS' | awk '{print $2}'
虚拟化与容器场景
在虚拟机(如VMware、KVM)或容器(如Docker)中,获取IP需注意接口名称差异:
- Docker容器:容器内执行
ip a或ifconfig查看容器IP(如eth0);宿主机可通过docker inspect <容器ID> | grep IPAddress查看容器IP。 - KVM虚拟机:虚拟机内获取IP方式与物理机相同;宿主机可通过
virsh domiflist <虚拟机名称>查看虚拟机网络接口,再结合ip a过滤。
常见命令对比与选择
为方便用户根据场景选择工具,以下表格对比了常用命令的特点:
| 命令 | 功能 | 适用场景 | 是否需要安装 |
|---|---|---|---|
ip addr |
查看所有网络接口的IP/IPv6/状态 | 现代Linux系统(推荐) | 系统自带(iproute2) |
ifconfig |
查看网络接口IP及状态 | 旧系统或兼容场景 | 需安装net-tools |
hostname -I |
快速获取非回环接口IP | 脚本中快速提取IP | 系统自带 |
curl ipinfo.io |
获取公网IP及详细信息 | 需公网IP的场景 | 需安装curl |
nmcli |
查看NetworkManager管理的网络信息 | 使用NetworkManager的系统 | 系统自带(通常已安装) |
相关问答FAQs
问题1:为什么执行ifconfig命令提示“command not found”?
解答:ifconfig属于net-tools套件,部分现代Linux发行版(如Ubuntu 22.04+、CentOS 9+)默认不再安装该工具,解决方法有两种:
- 安装
net-tools:- Debian/Ubuntu系统:
sudo apt update && sudo apt install net-tools - CentOS/RHEL系统:
sudo yum install net-tools
- Debian/Ubuntu系统:
- 使用替代命令
ip addr(推荐),该命令是现代Linux系统的标准工具,功能更强大且无需额外安装。
问题2:如何通过脚本获取本机IPv4地址并赋值给变量?
解答:在Shell脚本中,可通过命令替换()将命令输出赋值给变量,以下是两种常用方法:
- 使用
ip命令(推荐,兼容现代系统):local_ip=$(ip a | grep 'inet ' | grep -v 'lo' | awk '{print $2}' | cut -d'/' -f1) echo "本机IPv4地址: $local_ip" - 使用
hostname命令(简洁,但可能返回多个IP):local_ip=$(hostname -I | awk '{print $1}') echo "本机IPv4地址: $local_ip"若需确保获取指定接口(如
eth0)的IP,可修改为:local_ip=$(ip a show eth0 | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1)
