以下是实现该需求的完整方案,分为脚本编写和udev规则配置两部分:
补一个手动创建的命令:
sudo sh -c 'echo "auto '$(ip a | grep enx | awk -F'[ :]+' '{print $2}')'\niface '$(ip a | grep enx | awk -F'[ :]+' '{print $2}')' inet dhcp" > /etc/network/interfaces.d/'$(ip a | grep enx | awk -F'[ :]+' '{print $2}')''
一、创建自动化脚本
sudo nano /usr/local/bin/create_usb_interface.sh
内容如下(网卡名是enx开头,如果有其它开头的得继续优化):
#!/bin/bash
sudo sh -c 'echo "auto '$(ip a | grep enx | awk -F'[ :]+' '{print $2}')'\niface '$(ip a | grep enx | awk -F'[ :]+' '{print $2}')' inet dhcp" > /etc/network/interfaces.d/'$(ip a | grep enx | awk -F'[ :]+' '{print $2}')''
另外有ipv6版本:
#!/bin/sh
INTERFACE=$(ip a | grep enx | awk -F'[ :]+' '{print $2}' | head -n 1)
echo "auto $INTERFACE\niface $INTERFACE inet dhcp\niface $INTERFACE inet6 dhcp" > /etc/network/interfaces.d/"$INTERFACE"
赋予执行权限:
sudo chmod +x /usr/local/bin/create_usb_interface.sh
二、配置udev规则
sudo nano /etc/udev/rules.d/99-usb-network.rules
# 当检测到USB网卡插入时触发脚本
ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ENV{ID_BUS}=="usb", RUN+="/usr/local/bin/create_usb_interface.sh %k"
三、验证与调试
重新加载udev规则
sudo udevadm control --reload-rules
手动触发测试
sudo udevadm trigger --action=add --subsystem-match=net
检查日志
tail -f /var/log/usb_net_config.log
四、关键改进说明
直接使用udev传递的接口名
- 通过
%k
参数直接获取内核分配的接口名称(如enx5c53107312f1
) - 避免使用
ip a
命令可能产生的竞态条件
- 通过
精确匹配USB网卡
ENV{ID_BUS}=="usb"
确保只响应USB设备DRIVERS=="?*"
排除虚拟设备
日志记录
- 所有操作记录到
/var/log/usb_net_config.log
- 方便后续排查问题
- 所有操作记录到
五、高级配置(可选)
防止重复配置
# 在脚本开头添加检查 if [ -f "/etc/network/interfaces.d/$INTERFACE" ]; then echo "$(date): $INTERFACE 配置已存在,跳过创建" >> /var/log/usb_net_config.log exit 0 fi
网络服务自动重载
# 在脚本末尾添加(根据发行版选择) if systemctl is-active --quiet networking; then systemctl reload networking elif systemctl is-active --quiet NetworkManager; then nmcli connection reload fi
六、注意事项
接口命名规则
- 现代Linux系统使用
Predictable Network Interface Names
- 确保系统未启用
net.ifnames=0
内核参数
- 现代Linux系统使用
权限问题
脚本和配置文件目录需确保root权限
sudo chown root:root /usr/local/bin/create_usb_interface.sh sudo chmod 755 /etc/network/interfaces.d/
冲突解决
- 如果存在NetworkManager,建议通过
nmcli
配置 - 或创建
/etc/network/interfaces
的符号链接
- 如果存在NetworkManager,建议通过
通过以上配置,当插入USB网卡时,系统将自动完成以下操作:
- 检测到新的网络接口
- 创建DHCP配置文件
- 记录操作日志
- (可选)自动重载网络配置
实际效果可通过以下命令验证:
ip a show enx5c53107312f1
cat /etc/network/interfaces.d/enx5c53107312f1
评论 (0)