如何在安装特定闪存驱动器时运行脚本?

54 usb mount

有没有办法在安装特定 USB 设备时运行脚本?

我将视频保存在单独的 USB 上,并希望运行一个脚本,将 USB 设备上的视频文件夹安装到主文件夹中的文件夹。

sum*_*mid 41

现在systemd有更好的解决方案。您创建了一个依赖于您的媒体并且需要您的服务,例如:/etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/home/you/bin/triggerScript.sh

[Install]
WantedBy=media-YourMediaLabel.mount
Run Code Online (Sandbox Code Playgroud)

然后你必须启动/启用服务:

sudo systemctl start your.service
sudo systemctl enable your.service
Run Code Online (Sandbox Code Playgroud)

挂载后,systemd 会触发您的触发器脚本。与 udev 规则相比的优势在于脚本真正在挂载后触发,而不是在添加系统设备后触发。

用例:我有一个要自动备份的加密分区。添加设备后,我必须输入密码。如果我将备份脚本连接到 udev,脚本会在我输入密码时尝试运行,这将失败。

资源:使用 udev 编写脚本

注意:您可以通过以下方式找到您的设备单元:

systemctl list-units -t mount
Run Code Online (Sandbox Code Playgroud)

  • 伟大的!在 Debian Jessie 中测试。不要忘记启用你的服务`systemctl enable your.service`。脚本文件必须是可执行的。 (4认同)

Oli*_*Oli 31

首先在 中找到您的设备lsusb。请注意 ID(例如0a81:0101

/etc/udev/rules.d/via 中创建一个新的 udev 规则文件,sudoedit /etc/udev/rules.d/100-mount-videos.rules然后在其中创建一个新规则,如下所示:

ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"
Run Code Online (Sandbox Code Playgroud)

请注意我如何使用lsusb.

然后你只需要编写脚本来完成工作。一个简单的 mount 命令应该可以工作。您可能需要sleep 5在那里使用命令来等待文件系统初始化(如果您让 gnome 进行主挂载——但您可以先挂载它,然后您可能不需要睡眠)。

Allan 的补充:长时间运行的脚本可能会阻止“此设备或相关设备的所有进一步事件”。我的 Mint 手册页进一步指出“长时间运行的任务需要立即与事件进程本身分离。” 没有提供有关从哪里获得执行此操作的技能的提示。

Oli 的回复:像这样包裹它:https : //askubuntu.com/a/106359/449

  • 我可能建议在“RUN”命令前加上“su your_user -c”,这样脚本就不会以 root 权限运行。 (4认同)
  • @Kees 由于这里的目标是不断增加,因此保留 root 权限可能是一个好主意。也许不是将脚本保存在用户的家中,而是将它保存在 `/root/` 或只有 root 可以编辑它的某个地方。 (3认同)
  • 这不能回答问题。问题询问如何在 USB 驱动器被 *mounted* 时运行脚本。这个答案说明了如何运行在*插入*时安装USB驱动器的脚本。差异对我很重要,因为我有这样的脚本(用于数码相机);如果没有脚本,驱动器可能会或可能会在插入时安装(取决于用户设置),并且只有在安装驱动器时我才想做某事(复制图像)。所以我的脚本(在添加驱动器时运行)经常在错误的时间运行。 (2认同)

emo*_*t01 8

获取 ATTRS{idVendor} 和 ATTRS{idProduct} 值的另一种方法(在 Ubuntu 12.04 中测试)是:

  1. 找到您的 USB 安装位置:

    $ mount | grep /dev/sd*
    
    Run Code Online (Sandbox Code Playgroud)

    这显示如下内容:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用 udevadm 获取该设备信息:

    udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
    
    Run Code Online (Sandbox Code Playgroud)

    输出应该是这样的:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在使用 ATTRS{idProduct} 的模型 ID 和 ATTRS{idVendor} 的供应商 ID

    ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
    
    Run Code Online (Sandbox Code Playgroud)


bac*_*con 3

在 Nautilus 中的“编辑”>“首选项”>“媒体”下,您可以选择“其他操作”而不是“自定义命令”来执行不同类型的脚本/命令。到那时,USB 驱动器已经安装,但我想您仍然可以将其(使用自定义命令)链接到您希望驱动器出现在其中的文件夹。我无法判断这是否比使用 udev 更容易或更好。