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

有没有办法在安装特定的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中测试)的值的另一种方法是:

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

     $ mount | grep /dev/sd* 

    这显示如下内容:

     /dev/sdb on /media/SOMEDIR type vfat ... 
  2. 使用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 
  3. 现在使用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设备时,挂载点将更改为1 。 要解决此问题,您只需执行sudo systemctl reset-failed