![当安装特定的闪存驱动器时如何运行脚本?](https://linux22.com/image/957112/%E5%BD%93%E5%AE%89%E8%A3%85%E7%89%B9%E5%AE%9A%E7%9A%84%E9%97%AA%E5%AD%98%E9%A9%B1%E5%8A%A8%E5%99%A8%E6%97%B6%E5%A6%82%E4%BD%95%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
有没有办法在安装特定的 USB 设备时运行脚本?
我将视频保存在单独的 USB 上,并想运行一个脚本,将 USB 设备上的视频文件夹安装到主文件夹中。
答案1
有更好的解决方案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
然后您必须启动/启用该服务:
sudo systemctl start your.service
sudo systemctl enable your.service
挂载后,systemd 会触发触发脚本。与 udev 规则相比,其优势在于脚本真正在挂载后触发,而不是在添加系统设备后触发。
用例:我有一个加密分区,我想自动备份它。添加设备后,我必须输入密码。如果我将备份脚本挂接到 udev,则脚本会在我输入密码时尝试运行,但会失败。
资源:使用 udev 编写脚本
笔记:您可以使用以下方式找到您的设备单元:
systemctl list-units -t mount
答案2
首先在 中找到您的设备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"
请注意我是如何使用来自的 ID 的lsusb
。
然后你只需要编写脚本来完成工作。一个简单的 mount 命令就可以了。你可能需要一个sleep 5
命令来等待文件系统初始化(如果你让 gnome 进行主要安装——但你可以先安装它,然后可能不需要 sleep)。
Allan 补充:长时间运行的脚本可能会阻止“此设备或相关设备的所有后续事件”。我的 Mint 手册页进一步指出“长时间运行的任务需要立即与事件进程本身分离。”没有给出关于从哪里获得此技能的提示。
来自 Oli 的回复:像这样包装它:https://askubuntu.com/a/106359/449
答案3
获取 ATTRS{idVendor} 和 ATTRS{idProduct} 的值的另一种方法是(在 Ubuntu 12.04 中测试):
找到你的 USB 的安装位置:
$ mount | grep /dev/sd*
如下所示:
/dev/sdb on /media/SOMEDIR type vfat ...
使用 udevadm 获取该设备信息:
udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
输出应该是这样的:
E: ID_MODEL_ID=001a E: ID_VENDOR_ID=002b
现在使用 ATTRS{idProduct} 的模型 ID 和 ATTRS{idVendor} 的供应商 ID
ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
答案4
如果您不想干扰文件管理器(nautilus、konquerer、gnome 等)对设备挂载和卸载的控制,我建议不要使用 udev 路线。
相反,使用udisks-glue如果您的系统使用 udisk(几乎所有系统都使用 udisk)。
安装后,只需~/.udisks-glue.conf
在您的主目录中创建一个配置文件,如下所示。
以下示例每次插入 SD 卡时都会更新相机上的 GPS 辅助数据。
filter BT16EXTREME {
optical = false
partition_table = false
usage = filesystem
label = BT16EXTREME
}
match BT16EXTREME {
post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}
之后,只需确保 udisks-glue 在您启动或登录时启动即可。例如通过 gnome 的启动应用程序