如何实现USB插入时自动运行U盘内的bash脚本获取USB信息
我完全懂你的需求——网上大部分方案都是运行主机上的脚本,但你要的是U盘自带的bash脚本(比如getusbinfo.sh)在插入Linux系统时自动执行,还得把USB信息输出到文件(U盘或主机都可以)。因为Linux默认有安全限制,直接自动执行外部设备的脚本是被禁止的,下面给你几个可行的实现方案:
方案1:udev规则 + 主机辅助脚本(最通用)
这个方案适合所有Linux环境(桌面/服务器),核心是让系统检测到U盘插入后,先挂载U盘,再执行U盘上的脚本。主机上只需要一个极小的辅助脚本,主要负责挂载和触发逻辑。
第一步:准备U盘上的脚本
把你的getusbinfo.sh放到U盘根目录,先给它添加执行权限:chmod +x /path/to/usb/getusbinfo.sh脚本内容示例(同时支持输出到U盘和主机):
#!/bin/bash # 获取USB设备信息,输出到U盘根目录的usb_info.txt lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,VENDOR,MODEL > "$(dirname "$0")/usb_info.txt" # 可选:同时输出到主机的临时目录(需要主机有写入权限) lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,VENDOR,MODEL >> /tmp/usb_host_info.txt这里
$(dirname "$0")会自动指向脚本所在的U盘目录,不管U盘被挂载到主机的哪个路径,都能正确找到输出文件的位置。第二步:创建udev规则
在主机上创建/etc/udev/rules.d/99-usb-auto-run.rules文件,内容如下:# 匹配可移动存储设备(U盘),根据需要可以添加更具体的匹配条件 SUBSYSTEM=="block", KERNEL=="sd*", ATTRS{removable}=="1", ACTION=="add", RUN+="/usr/bin/systemd-run --wait --service-type=oneshot /usr/local/bin/run_usb_script.sh %N"为什么用
systemd-run?因为udev的执行环境非常受限,不能直接挂载设备或执行复杂脚本,交给systemd处理能避免环境变量、权限等问题。第三步:编写主机辅助脚本
创建/usr/local/bin/run_usb_script.sh,这个脚本的作用是挂载U盘并执行你的脚本:#!/bin/bash USB_DEVICE=$1 # 临时挂载点(可以自定义路径) MOUNT_POINT="/mnt/usb_temp" # 创建挂载点目录 mkdir -p $MOUNT_POINT # 挂载U盘(如果是ext4等Linux原生格式,去掉-t vfat参数即可) mount -t vfat -o rw,uid=$(id -u),gid=$(id -g) $USB_DEVICE $MOUNT_POINT # 检查U盘上的脚本是否存在且可执行,存在则运行 if [ -x "$MOUNT_POINT/getusbinfo.sh" ]; then "$MOUNT_POINT/getusbinfo.sh" fi # 延迟2秒再卸载,避免脚本还在运行就被卸载 sleep 2 umount $MOUNT_POINT # 删除临时挂载点 rmdir $MOUNT_POINT给这个辅助脚本添加执行权限:
chmod +x /usr/local/bin/run_usb_script.sh第四步:重载udev规则
执行以下命令让新的udev规则生效:udevadm control --reload-rules udevadm trigger现在插入U盘,系统就会自动挂载并执行你U盘上的脚本了。
方案2:桌面环境自动运行(仅桌面版)
如果你的Linux是桌面发行版(比如Ubuntu、Fedora),桌面环境(GNOME/KDE)会自动挂载U盘,这时候可以利用桌面的“自动运行”功能,不需要主机上的辅助脚本。
GNOME环境
- 在U盘根目录创建
.autorun文件,内容如下:[Desktop Entry] Type=Application Exec=sh getusbinfo.sh Name=Run USB Info Script - 给
.autorun添加执行权限:chmod +x /path/to/usb/.autorun - 插入U盘时,GNOME会弹出提示询问是否运行脚本,勾选“记住我的选择”后,下次插入就会自动执行。
- 在U盘根目录创建
KDE环境
- 在U盘根目录创建
autorun.desktop文件,内容和上面的.autorun一致 - 插入U盘时,KDE会弹出执行提示,设置为“总是允许”即可自动运行。
- 在U盘根目录创建
这个方案的优点是简单,但依赖桌面环境,而且默认需要用户确认(可以在桌面设置里调整自动运行的权限)。
方案3:自定义可启动U盘镜像(进阶)
如果需要完全脱离主机依赖(不需要在主机上配置任何东西),可以把U盘做成一个小型的可启动Linux镜像,插入时电脑从U盘启动,自动执行你的脚本后输出信息。这个方案适合特定场景,比如需要在多台无配置的主机上执行脚本。
- 大致步骤:
- 用
debootstrap创建一个最小的Linux根文件系统 - 配置启动引导(GRUB或Syslinux),让系统启动时自动执行
getusbinfo.sh - 把镜像写入U盘,插入主机后设置BIOS从U盘启动,系统会自动执行脚本并输出信息到U盘的分区
- 用
这个方案的缺点是操作复杂,而且插入时会占用主机的启动流程,适合有一定Linux系统知识的用户。
Linux默认禁止自动执行外部设备的脚本是出于安全考虑,所以这些方案都需要你手动调整主机设置或安全选项:
- 不要在公共或陌生主机上使用这些方案,避免恶意脚本被执行
- 如果只想针对特定U盘执行,可以在udev规则里添加
ATTRS{serial}=="你的U盘序列号"来精准匹配,用udevadm info -a -n /dev/sdb可以查看U盘的硬件属性。
内容的提问来源于stack exchange,提问作者tiger_groove




