菜鸟科技网

命令行如何快速获取网卡名称?

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

命令行如何快速获取网卡名称?-图1
(图片来源网络,侵删)

传统方法:使用ifconfigip命令

在较旧的Linux发行版(如CentOS 6、Ubuntu 14.04等)中,ifconfig是查看网络接口的常用工具,通过执行ifconfig -aifconfig命令,可以列出所有已启用和未启用的网卡名称。

ifconfig -a

输出结果中,eth0eth1等即为网卡名称,但在新版本系统中(如CentOS 7+、Ubuntu 18.04+),ifconfig可能未被预装,需通过net-tools包安装。

ip命令是现代Linux系统推荐使用的工具,功能更强大且稳定,通过以下命令可获取网卡名称:

ip link show

或简化为:

命令行如何快速获取网卡名称?-图2
(图片来源网络,侵删)
ip a

输出结果中,2: eth03: wlan0等行中的eth0wlan0即为网卡名称。ip命令的优势在于支持更详细的网络信息,如MAC地址、状态等。

基于udevpredictable network interfaces规则

从Linux内核3.x开始,主流发行版采用predictable network interfaces命名规则(如ens33enp0s3),名称由硬件信息生成,可通过以下方式获取:

  1. 查看/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"即为网卡名称。

    命令行如何快速获取网卡名称?-图3
    (图片来源网络,侵删)
  2. 查看/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/

输出结果如eth0lowlan0等,其中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 |

设备”列即为网卡名称。

通过lshwlspci命令获取硬件信息

若需了解网卡名称对应的硬件信息,可使用lshwlspci

sudo lshw -C network

lspci | grep Ethernet

输出结果会显示网卡型号及其对应的系统接口名称。

虚拟化环境中的特殊网卡名称

在虚拟机(如KVM、VMware)或容器(Docker、LXC)中,网卡名称可能带有特定前缀:

  • KVM虚拟机virtio网卡通常命名为vnet0vnet1等。
  • Docker容器:默认创建eth0,可通过--name自定义。
  • VMware:可能为ens33vmx0等。

脚本化获取网卡名称

在自动化运维中,可通过脚本动态获取网卡名称,使用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脚本自动化场景。

分享:
扫描分享到社交APP
上一篇
下一篇