You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现USB插入时自动运行U盘内的bash脚本获取USB信息

实现U盘自带脚本插入Linux自动运行的方案

我完全懂你的需求——网上大部分方案都是运行主机上的脚本,但你要的是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会弹出提示询问是否运行脚本,勾选“记住我的选择”后,下次插入就会自动执行。
  • KDE环境

    • 在U盘根目录创建autorun.desktop文件,内容和上面的.autorun一致
    • 插入U盘时,KDE会弹出执行提示,设置为“总是允许”即可自动运行。

这个方案的优点是简单,但依赖桌面环境,而且默认需要用户确认(可以在桌面设置里调整自动运行的权限)。

方案3:自定义可启动U盘镜像(进阶)

如果需要完全脱离主机依赖(不需要在主机上配置任何东西),可以把U盘做成一个小型的可启动Linux镜像,插入时电脑从U盘启动,自动执行你的脚本后输出信息。这个方案适合特定场景,比如需要在多台无配置的主机上执行脚本。

  • 大致步骤:
    1. debootstrap创建一个最小的Linux根文件系统
    2. 配置启动引导(GRUB或Syslinux),让系统启动时自动执行getusbinfo.sh
    3. 把镜像写入U盘,插入主机后设置BIOS从U盘启动,系统会自动执行脚本并输出信息到U盘的分区

这个方案的缺点是操作复杂,而且插入时会占用主机的启动流程,适合有一定Linux系统知识的用户。

重要安全提示

Linux默认禁止自动执行外部设备的脚本是出于安全考虑,所以这些方案都需要你手动调整主机设置或安全选项:

  • 不要在公共或陌生主机上使用这些方案,避免恶意脚本被执行
  • 如果只想针对特定U盘执行,可以在udev规则里添加ATTRS{serial}=="你的U盘序列号"来精准匹配,用udevadm info -a -n /dev/sdb可以查看U盘的硬件属性。

内容的提问来源于stack exchange,提问作者tiger_groove

火山引擎 最新活动