在Linux和Unix-like系统中,命令行获取网卡名称是网络管理和系统维护的基础操作,网卡名称的获取方式因系统版本和网络管理工具的不同而有所差异,以下是详细的方法和场景分析。

传统方法:使用ifconfig
和ip
命令
在较旧的Linux发行版(如CentOS 6、Ubuntu 14.04等)中,ifconfig
是查看网络接口的常用工具,通过执行ifconfig -a
或ifconfig
命令,可以列出所有已启用和未启用的网卡名称。
ifconfig -a
输出结果中,eth0
、eth1
等即为网卡名称,但在新版本系统中(如CentOS 7+、Ubuntu 18.04+),ifconfig
可能未被预装,需通过net-tools
包安装。
ip
命令是现代Linux系统推荐使用的工具,功能更强大且稳定,通过以下命令可获取网卡名称:
ip link show
或简化为:

ip a
输出结果中,2: eth0
、3: wlan0
等行中的eth0
、wlan0
即为网卡名称。ip
命令的优势在于支持更详细的网络信息,如MAC地址、状态等。
基于udev
和predictable network interfaces
规则
从Linux内核3.x开始,主流发行版采用predictable network interfaces
命名规则(如ens33
、enp0s3
),名称由硬件信息生成,可通过以下方式获取:
-
查看
/etc/udev/rules.d/70-persistent-net.rules
文件(CentOS 6/7): 该文件记录了网卡与MAC地址的绑定关系,SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:12:34:56", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
其中
NAME="eth0"
即为网卡名称。(图片来源网络,侵删) -
查看
/etc/netplan/
或NetworkManager
配置文件(Ubuntu 18.04+): 在netplan
配置文件中(如01-network-manager-all.yaml
),网卡名称通常直接定义在接口部分:ethernets: enp0s3: dhcp4: true
其中
enp0s3
即为网卡名称。
通过ls
命令查看/sys/class/net/
目录
系统中的所有网卡信息都存储在/sys/class/net/
目录下,执行以下命令可直接获取网卡名称列表:
ls /sys/class/net/
输出结果如eth0
、lo
、wlan0
等,其中lo
为回环接口,实际物理网卡或虚拟网卡名称可通过过滤lo
获取:
ls /sys/class/net/ | grep -v lo
使用nmcli
工具(NetworkManager环境)
在安装了NetworkManager的系统(如Fedora、Ubuntu桌面版)中,nmcli
是命令行管理网络的首选工具,通过以下命令可获取网卡名称及其状态:
nmcli device status
输出表格如下: | 设备 | 类型 | 状态 | 连接 | |------------|--------|----------|------| | enp0s3 | ethernet| 已连接 | eth0 | | wlan0 | wifi | 断开 | -- | | lo | loopback| 已连接 | lo |
设备”列即为网卡名称。
通过lshw
或lspci
命令获取硬件信息
若需了解网卡名称对应的硬件信息,可使用lshw
或lspci
:
sudo lshw -C network
或
lspci | grep Ethernet
输出结果会显示网卡型号及其对应的系统接口名称。
虚拟化环境中的特殊网卡名称
在虚拟机(如KVM、VMware)或容器(Docker、LXC)中,网卡名称可能带有特定前缀:
- KVM虚拟机:
virtio
网卡通常命名为vnet0
、vnet1
等。 - Docker容器:默认创建
eth0
,可通过--name
自定义。 - VMware:可能为
ens33
、vmx0
等。
脚本化获取网卡名称
在自动化运维中,可通过脚本动态获取网卡名称,使用awk
提取ip a
命令的输出:
ip a | awk '/^[0-9]+:/ {print $2}' | tr -d ':'
或通过/sys/class/net/
目录遍历:
for interface in /sys/class/net/*; do echo $(basename $interface) done
相关问答FAQs
Q1: 为什么我的系统网卡名称是eth0
,而其他系统是ens33
?
A: 这与系统的网络接口命名规则有关,旧版Linux使用传统命名(如eth0
),而新版系统(如CentOS 7+、Ubuntu 18.04+)默认采用predictable network interfaces
规则,名称基于硬件信息(如enp0s3
中的en
表示以太网,p0
表示PCI插槽,s3
表示插槽序号),可通过修改/etc/default/grub
中的GRUB_CMDLINE_LINUX
参数添加net.ifnames=0 biosdevname=0
恢复传统命名,但需注意兼容性问题。
Q2: 如何在脚本中判断某个网卡是否存在?
A: 可通过以下方式检查网卡是否存在:
if [ -d "/sys/class/net/eth0" ]; then echo "网卡eth0存在" else echo "网卡eth0不存在" fi
或使用ip
命令:
if ip link show eth0 &>/dev/null; then echo "网卡eth0存在" else echo "网卡eth0不存在" fi
这两种方法分别通过检查文件系统路径和命令执行结果判断网卡状态,适用于Shell脚本自动化场景。