如何在安装特定闪存驱动器时运行脚本?
有没有办法在安装特定的USB设备时运行脚本?
我将我的video保存在单独的USB上,并希望运行一个脚本,将USB设备上的video文件夹安装到主文件夹中的video文件夹。
首先在lsusb
找到您的设备。 注意ID(例如0a81:0101
)
通过sudoedit /etc/udev/rules.d/100-mount-videos.rules
在/etc/udev/rules.d/
创建一个新的udev规则文件, /etc/udev/rules.d/
像这样在那里修改一个新规则:
ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"
请注意我是如何使用lsusb
的ID的。
然后你只需编写脚本来完成工作。 一个简单的mount命令应该可行。 你可能需要一个sleep 5
命令来等待文件系统初始化(如果你让gnome进行主安装 – 但你可以先安装它然后你可能不需要睡眠)。
来自Allan的补充:长时间运行的脚本可能会阻止“此设备或依赖设备的所有其他事件”。 My Mint手册页进一步指出“长时间运行的任务需要立即脱离事件过程本身。” 没有给出关于从哪里获得技能的提示。
来自Oli的回复:像这样包装: https : //askubuntu.com/a/106359/449
现在有更好的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
mount之后,systemd会触发你的触发器脚本。 优于udev规则的优点是脚本在挂载后真正触发,而不是在添加系统设备之后触发。
使用案例 :我有一个加密分区,我想自动备份。 添加设备后,我必须输入密码。 如果我将备份脚本挂钩到udev,则脚本会在我输入密码时尝试运行,这将失败。
资源: 用udev编写脚本
注意:您可以使用以下sudo systemctl list-units -t mount
找到您的设备单元: sudo systemctl list-units -t mount
获取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" ...
在Nautilus的编辑>首选项>媒体下,您可以选择“其他操作”而不是“costum命令”。 用于执行不同类型的媒体。 到那时usb驱动器已经安装,但我想你仍然可以将它(使用costum命令)链接到你希望驱动器出现的文件夹。我无法分辨这是否比使用udev更容易或更好。
如果您不想干扰文件管理器(nautilus,konquerer,gnome等)对安装和卸载设备的控制,我建议不要使用udev路由。
相反,如果您的系统使用udisks(几乎所有都使用),请使用udisks-glue 。
安装后,只需在您的主目录中创建一个配置文件~/.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的启动应用程序
@ sumid的答案有问题。 你不应该启动这项服务。 你只需要启用它。
文件: /etc/systemd/system/your.service
[Unit] Description=My flashdrive script trigger Requires=media-YourMediaLabel.mount After=media-YourMediaLabel.mount [Service] ExecStart=/any_path_even_inside_the_mount_point/script.sh [Install] WantedBy=media-YourMediaLabel.mount
然后启用该服务:
sudo systemctl enable your.service
就这样。
注意:您可以使用以下sudo systemctl list-units -t mount
找到您的medial标签: sudo systemctl list-units -t mount
注意2:如果服务以某种方式失败(例如,脚本不可执行),则下次挂载USB设备时,挂载点将更改为
。 要解决此问题,您只需执行sudo systemctl reset-failed