在Linux系统中获取本机IP地址是日常运维、网络配置和开发调试中的常见需求,本机IP地址可分为内网IP(局域网IP)和公网IP(外网IP),内网IP是局域网内部分配的地址,公网IP则是互联网上可见的出口IP,以下详细介绍几种常用的Linux获取本机IP的方法,涵盖命令行工具、系统配置文件解析及自动化脚本场景。
使用命令行工具获取IP地址
命令行工具是Linux中最直接、高效的IP获取方式,不同工具适用于不同场景和系统版本。
ip
命令(现代Linux系统推荐)
ip
命令是iproute2
包中的工具,逐渐取代了旧的ifconfig
,是现代Linux系统获取网络信息的首选,通过ip addr show
(或简写ip a
)可以查看所有网络接口的详细信息,包括IP地址、子网掩码、MAC地址等。
基本用法:
查看所有接口IP:
ip addr show
输出示例中,inet
字段后跟IPv4地址(如168.1.100/24
),inet6
字段后跟IPv6地址,若需仅提取IPv4地址,可结合grep
和awk
过滤:
ip addr show | grep 'inet ' | awk '{print $2}' | cut -d/ -f1
指定接口查看(如eth0
):
ip addr show dev eth0 | grep 'inet ' | awk '{print $2}' | cut -d/ -f1
ifconfig
命令(旧版Linux系统)
ifconfig
是传统的网络配置工具,在早期Linux版本(如CentOS 6及以下)中广泛使用,但新版本系统(如Ubuntu 20.04+、CentOS 7+)默认未安装,需手动安装net-tools
包。
基本用法:
查看所有接口IP:
ifconfig
指定接口查看(如eth0
):
ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | cut -d: -f2
hostname
命令
hostname
命令主要用于查看或设置系统主机名,但结合-I
选项可快速获取所有IPv4地址(空格分隔)。
基本用法:
hostname -I
输出示例:168.1.100 10.0.0.5
(多个IP时用空格分隔),适合仅需快速获取IPv4的场景。
nmcli
命令(NetworkManager工具)
在桌面版Linux(如Ubuntu、Fedora)或使用NetworkManager管理网络的系统中,nmcli
是图形化网络配置的命令行工具,可精确获取网络连接的IP信息。
基本用法:
查看活动连接的IP:
nmcli device show | grep IP4.ADDRESS
或指定连接名称(如eth0
):
nmcli connection show "eth0" | grep ipv4.addresses
获取公网IP地址
内网IP是局域网内的地址,若需获取互联网上的公网IP(如路由器NAT后的出口IP),需通过外部HTTP服务查询。
使用curl
命令
curl
是常用的HTTP客户端工具,可访问提供IP查询服务的API,返回公网IP。
常用服务:
ifconfig.me
:curl ifconfig.me
ipinfo.io
:curl ipinfo.io/ip
icanhazip.com
:curl icanhazip.com
使用wget
命令
若系统中未安装curl
,可用wget
替代:
wget -qO- ifconfig.me
从系统配置文件中解析IP
通过直接读取网络配置文件,可获取静态配置的IP地址,适合脚本自动化或无需实时更新的场景。
Debian/Ubuntu系统(/etc/network/interfaces
)
静态IP配置通常存储在/etc/network/interfaces
文件中,通过解析iface
段的address
字段获取:
grep "address" /etc/network/interfaces | awk '{print $2}'
CentOS/RHEL系统(/etc/sysconfig/network-scripts/ifcfg-*
)
CentOS/RHEL的接口配置文件位于/etc/sysconfig/network-scripts/
,文件名格式为ifcfg-eth0
,IP通过IPADDR
字段定义:
grep "IPADDR" /etc/sysconfig/network-scripts/ifcfg-eth0 | awk -F= '{print $2}'
Ubuntu 18.04+(Netplan配置)
Ubuntu 18.04及后续版本使用Netplan,配置文件为YAML格式(如/etc/netplan/01-netcfg.yaml
),通过解析addresses
列表获取IP:
grep "addresses:" /etc/netplan/01-netcfg.yaml | awk '{print $2}' | tr -d '[],'
不同场景下的方法对比
方法 | 命令示例 | 适用场景 | 优点 | 缺点 |
---|---|---|---|---|
ip addr |
ip addr show | grep 'inet ' |
现Linux系统,需精确接口信息 | 信息全面,支持IPv4/IPv6 | 需结合过滤命令提取IP |
ifconfig |
ifconfig eth0 | grep 'inet addr' |
旧版Linux系统 | 兼容性好 | 新版系统默认未安装 |
hostname -I |
hostname -I |
快速获取所有IPv4 | 简单高效 | 仅支持IPv4,无法指定接口 |
nmcli |
nmcli device show | grep IP4.ADDRESS |
NetworkManager管理的系统 | 支持动态连接,信息详细 | 依赖NetworkManager |
外部API(curl) | curl ifconfig.me |
获取公网IP | 无需本地配置,直接获取出口IP | 需联网,依赖外部服务可用性 |
配置文件解析 | grep "address" /etc/network/interfaces |
脚本自动化,静态IP配置 | 无需执行命令,直接读取文件 | 仅适用于静态配置,不适用DHCP |
相关问答FAQs
问题1:为什么使用ip addr show
有时会显示多个IP地址?
解答:ip addr show
显示所有网络接口的IP,包括物理接口(如eth0
)、虚拟接口(如docker0
)、回环接口(lo
)等,若同一接口配置了多个IP(如别名IP、VIP),也会显示多个结果,可通过指定接口(如ip addr show dev eth0
)或过滤scope global
(全局作用域)获取目标IP,
ip addr show | grep 'scope global' | grep 'inet ' | awk '{print $2}' | cut -d/ -f1
问题2:如何判断获取的IP地址是内网IP还是公网IP?
解答:可通过IP地址范围判断:内网IPv4地址通常属于以下私有网段:
- 0.0.0/8(10.0.0.0 ~ 10.255.255.255)
- 16.0.0/12(172.16.0.0 ~ 172.31.255.255)
- 168.0.0/16(192.168.0.0 ~ 192.168.255.255)
若IP不在上述范围内,则为公网IP,可通过ip route get
查看IP的路由网关,若网关为局域网网关(如192.168.1.1),则为内网IP;若网关为公网网关(如运营商分配的网关),则为公网IP。
ip route get 8.8.8.8 | grep -oP 'src KS+'
该命令会显示访问公网IP(8.8.8.8)时使用的源IP(即公网IP)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/17343.html