![连接 USB 设备时运行脚本](https://linux22.com/image/847134/%E8%BF%9E%E6%8E%A5%20USB%20%E8%AE%BE%E5%A4%87%E6%97%B6%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC.png)
我尝试在 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/
我有两个问题:
每当我插入 USB 设备时,都会执行该脚本,因为
env.out
会生成一个文件/tmp
,但是USB 设备中的数据未复制到测试目录。如果我手动运行脚本,它就可以正常工作!为什么?
我怎样才能使我的规则文件更加通用,以便它能适用于任何不知道其 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
尝试用您的主目录的完整路径替换波浪号。我不知道这是否会起作用,但您说脚本在直接运行它时可以工作,但在自动运行时却不行:这让我想到问题可能在于它在自动运行时由不同的用户运行,波浪号会为不同的用户解析为不同的值。