连接 USB 设备时运行脚本

连接 USB 设备时运行脚本

我尝试在 U 盘连接到我的系统时运行一个脚本。我遵循问题并且它正在运行,但仍然存在一些问题。

这是我的udev规则文件:

ACTION=="add", ATTRS{idVendor}=="8564", ATTRS{idProduct}=="1000", RUN+="/usr/local/my_script.sh"

这是我的脚本:

#!/bin/bash

env > /tmp/env.out
cp -r /media/*device-name*/* ~/test/

我有两个问题:

  1. 每当我插入 USB 设备时,都会执行该脚本,因为env.out会生成一个文件/tmp,但是USB 设备中的数据未复制到测试目录

    如果我手动运行脚本,它就可以正常工作!为什么?

  2. 我怎样才能使我的规则文件更加通用,以便它能适用于任何不知道其 ID 的 USB 设备?

我的想法是,当连接任何连接的 USB 设备时,自动将所有数据复制到我的计算机。

答案1

回答我自己的问题:

1. 该脚本未运行,因为它需要sudo权限才能运行。

为了解决这个问题,使此脚本sudo可执行:

  • 使用以下方法编辑sudoers文件:

    sudo visudo
    
  • 在第 25 行(即%sudo ALL=(ALL))之后添加以下内容:

    username  ALL=(ALL) NOPASSWD: /home/username/my_script.sh
    

现在我们可以使用sudo此脚本而无需输入密码sudo。然而,这可能会导致一些安全问题,所以请参考这个问题:如何在脚本中执行 sudo 命令而不要求输入密码?

2. 回答我的第二个问题:

编写此脚本适用于任何 USB 设备连接后,将udev规则文件的内容更改为:

ACTION=="add", ATTRS{idVendor}=="`****`", ATTRS{idProduct}=="`****`", RUN+="/usr/local/my_script.sh"

星号(*)表示应该对每个连接的 USB 设备执行此操作。

就是这样!确保脚本可执行并插入 USB!

享受!

答案2

尝试用您的主目录的完整路径替换波浪号。我不知道这是否会起作用,但您说脚本在直接运行它时可以工作,但在自动运行时却不行:这让我想到问题可能在于它在自动运行时由不同的用户运行,波浪号会为不同的用户解析为不同的值。

相关内容