在Linux系统中,获取本机内网IP地址是网络配置、服务器管理、故障排查等场景中的常见需求,内网IP通常指私有IP地址,属于RFC 1918定义的保留地址段,包括10.0.0.0/8、172.16.0.0/12、192.168.0.0/16,以及本地环回地址127.0.0.1(不属于内网IP,但常被用于本地测试),本文将详细介绍Linux系统中获取内网IP的多种方法,涵盖命令行工具、配置文件读取、编程接口等,并分析不同方法的适用场景和注意事项。
使用ifconfig
命令获取内网IP
ifconfig
是传统的Linux网络配置工具,虽然在新版系统中逐渐被ip
命令取代,但许多发行版仍默认支持或可通过安装使用,通过ifconfig
可以查看所有网络接口的IP配置信息,包括内网IP。
操作步骤:
-
安装
ifconfig
(若未预装)- 在基于Debian/Ubuntu的系统上:
sudo apt install net-tools
- 在基于CentOS/RHEL的系统上:
sudo yum install net-tools
- 在基于Debian/Ubuntu的系统上:
-
执行命令查看IP
直接输入ifconfig
或ifconfig -a
(显示所有接口,包括未激活的),输出结果中每个网络接口下的inet
字段即为该接口的IPv4地址。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::a00:27ff:fe4e:66a1 prefixlen 64 scopeid 0x20<link> ether 08:00:27:4e:66:a1 txqueuelen 1000 (Ethernet) RX packets 1234 bytes 123456 (123.4 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 567 bytes 78901 (77.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
其中
inet 192.168.1.100
即为内网IP。 -
提取指定接口的IP
若需仅查看某个接口(如eth0
)的IP,可通过管道结合grep
和awk
过滤:ifconfig eth0 | grep 'inet ' | awk '{print $2}'
使用ip
命令获取内网IP
ip
是Linux系统中更现代、功能更强大的网络配置工具,属于iproute2
包,默认安装在大多数发行版中,相比ifconfig
,ip
命令支持更丰富的网络管理功能,推荐优先使用。
操作步骤:
-
查看所有接口IP
执行ip addr show
或简写ip a
,输出中每个接口下的inet
字段包含IP地址和子网掩码(如168.1.100/24
)。2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe4e:66a1/64 scope link valid_lft forever preferred_lft forever
其中
inet 192.168.1.100/24
中的168.1.100
即为内网IP。 -
提取指定接口的IP
若需查看特定接口(如eth0
)的IP,可执行:ip addr show eth0 | grep 'inet ' | awk '{print $2}' | cut -d/ -f1
cut -d/ -f1
用于去除子网掩码部分(如/24
),仅保留IP地址。 -
过滤内网IP段
若需排除公网IP和回环地址,仅显示内网IP,可通过grep
结合正则表达式:ip addr show | grep -E 'inet (10.|172.(1[6-9]|2[0-9]|3[01]).|192.168.)' | awk '{print $2}' | cut -d/ -f1
此命令会匹配10.x.x.x、172.16.x.x-172.31.x.x、192.168.x.x三个内网段。
读取网络配置文件获取IP
对于静态IP配置的系统,内网IP信息通常存储在网络配置文件中,不同发行版的配置文件路径不同,直接读取文件可获取IP信息,适合自动化脚本场景。
Debian/Ubuntu系统(/etc/network/interfaces
)
配置文件示例:
auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1
通过grep
提取address
字段:
grep 'address' /etc/network/interfaces | awk '{print $2}'
CentOS/RHEL系统(/etc/sysconfig/network-scripts/ifcfg-eth0
)
配置文件示例:
TYPE=Ethernet BOOTPROTO=static IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.8.8.8
通过grep
提取IPADDR
字段:
grep 'IPADDR' /etc/sysconfig/network-scripts/ifcfg-eth0 | awk -F= '{print $2}'
注意事项:
- 若系统使用DHCP动态获取IP,配置文件中可能无
address
或IPADDR
字段,此方法仅适用于静态IP配置。 - 虚拟网卡(如
docker0
、virbr0
)的IP也可能被读取,需结合接口名称过滤。
使用NetworkManager工具(nmcli
)
对于使用NetworkManager管理网络的系统(如Ubuntu、CentOS 7+),可通过nmcli
命令获取IP信息,支持图形化网络配置的查询,适合桌面系统和服务器。
操作步骤:
-
查看所有设备的IP
执行nmcli device show
,输出中包含每个设备的IP配置信息,GENERAL.DEVICE: eth0 GENERAL.TYPE: ethernet GENERAL.HWADDR: 08:00:27:4E:66:A1 IP4.ADDRESS[1]: 192.168.1.100/24 IP4.GATEWAY[1]: 192.168.1.1
其中
IP4.ADDRESS[1]
即为IPv4内网IP。 -
提取指定设备的IP
若需查看eth0
的IP,可执行:nmcli device show eth0 | grep 'IP4.ADDRESS' | awk '{print $2}' | cut -d/ -f1
-
查看活动连接的IP
通过nmcli connection show
可查看网络连接配置,结合grep
过滤IP:nmcli connection show --active | grep 'eth0' | xargs -n 1 nmcli connection show | grep 'ipv4.addresses' | awk '{print $2}'
通过编程方式获取内网IP
在自动化运维或开发场景中,可能需要通过脚本或程序获取内网IP,以下是Python和Shell脚本的示例方法。
Python脚本(使用socket
和netifaces
库)
-
方法1:使用
socket
库(简单但可能不准确)import socket try: ip = socket.gethostbyname(socket.gethostname()) if not ip.startswith('127.'): print(ip) except: pass
注意:此方法可能因主机名解析问题返回公网IP或127.x.x.x,需结合其他方法验证。
-
方法2:使用
netifaces
库(推荐,更可靠)
首先安装库:pip install netifaces
脚本示例:import netifaces def get_internal_ip(): internal_ips = [] interfaces = netifaces.interfaces() for iface in interfaces: if iface == 'lo': continue addrs = netifaces.ifaddresses(iface) if netifaces.AF_INET in addrs: for addr_info in addrs[netifaces.AF_INET]: ip = addr_info['addr'] if ip.startswith(('10.', '172.', '192.168.')): internal_ips.append((iface, ip)) return internal_ips if __name__ == '__main__': for iface, ip in get_internal_ip(): print(f"Interface: {iface}, Internal IP: {ip}")
Shell脚本(结合ip
命令)
#!/bin/bash get_internal_ips() { ip addr show | grep -E 'inet (10.|172.(1[6-9]|2[0-9]|3[01]).|192.168.)' | awk '{print $2}' | cut -d/ -f1 } for ip in $(get_internal_ips); do echo "Internal IP: $ip" done
不同获取方法的对比
为方便选择合适的方法,以下通过表格总结常见命令的特点:
方法 | 命令示例 | 是否需要root | 输出格式 | 适用场景 | 注意事项 |
---|---|---|---|---|---|
ifconfig |
ifconfig eth0 | grep 'inet ' |
否 | 接口名+IP(如eth0: 192.168.1.100 ) |
传统系统、快速查看 | 需安装net-tools ,旧版系统 |
ip |
ip addr show eth0 | grep 'inet ' |
否 | IP/子网(如168.1.100/24 ) |
现代Linux系统、推荐使用 | 默认安装,功能全面 |
配置文件读取 | grep 'address' /etc/network/interfaces |
是 | 纯IP(如168.1.100 ) |
静态IP配置、自动化脚本 | 仅适用于静态IP,需知道文件路径 |
nmcli |
nmcli device show eth0 | grep 'IP4.ADDRESS' |
否 | IP/子网(如168.1.100/24 ) |
NetworkManager管理的系统 | 适合桌面系统和CentOS 7+ |
Python脚本 | netifaces 库获取 |
否 | 接口名+IP(列表形式) | 开发、自动化运维 | 需安装第三方库,可扩展性强 |
相关问答FAQs
问题1:为什么使用ifconfig
命令时看不到任何IP地址输出?
解答:可能的原因有以下几种:
net-tools
未安装:新版Linux系统(如Ubuntu 20.04+、CentOS 8+)默认不安装ifconfig
,需通过sudo apt install net-tools
(Debian/Ubuntu)或sudo yum install net-tools
(CentOS/RHEL)安装。- 网卡未启动:执行
ifconfig
时若显示eth0: ERROR while getting interface flags: No such device
,说明网卡未激活,可通过sudo ifconfig eth0 up
启动,或使用systemctl restart networking
(Debian/Ubuntu)重启网络服务。 - 网卡名称错误:虚拟化或新硬件中网卡名称可能不是
eth0
,而是ens33
、enp0s3
等,可通过ip link
查看所有网卡名称。 - DHCP未获取到IP:若系统使用DHCP动态获取IP,但DHCP服务器未响应或配置错误,可能导致无IP,可通过
sudo dhclient eth0
手动获取IP,或检查/var/log/syslog
(Debian/Ubuntu)或/var/log/messages
(CentOS/RHEL)查看DHCP错误日志。
问题2:如何在脚本中只获取某个特定网卡的IPv4内网IP,并排除虚拟网卡和回环接口?
解答:可通过ip
命令结合grep
和awk
实现,例如获取eth0
的内网IP并排除docker0
、virbr0
等虚拟网卡:
ip addr show eth0 | grep -E 'inet [0-9]' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d/ -f1
命令解析:
ip addr show eth0
:查看eth0
接口的IP信息;grep -E 'inet [0-9]'
:匹配IPv4地址(排除IPv6);grep -v '127.0.0.1'
:排除回环地址;awk '{print $2}'
:提取IP/子网掩码字段;cut -d/ -f1
:去除子网掩码,仅保留IP地址。
若需排除更多虚拟网卡(如docker0
、virbr0
),可在grep -v
中添加接口名:
ip addr show eth0 | grep -E 'inet [0-9]' | grep -v '127.0.0.1|docker0|virbr0' | awk '{print $2}' | cut -d/ -f1
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/31701.html