我正在尝试运行以下命令,而无需 sudo:
echo 1 | sudo tee -a /sys/block/$hd/device/delete
对于我的驱动器托架中的每个 HDD,$hd 变量都会从 sdb -> sdi 动态变化。
我在 sudoers 文件中添加了以下行:
operator ALL=/sys/block/sdb/device/delete
但这并没有什么区别,即使我运行它仍然要求输入 sudo 密码:
echo 1 | sudo tee -a /sys/block/sdb/device/delete
答案1
该sudoers
行只能指向您要运行的命令,而不是目标输出文件。该行下面的任何内容/sys
都是将字符写入的特殊设备。
您要做的就是创建一个脚本,该脚本将echo 1 > /sys/block/$hd/device/delete
检查 $hd 是否与正则表达式匹配/sd[b-i]/
。将 sudo 命令指向该脚本,而不是您拥有它的位置。
此外,迈克尔·汉普顿是对的:有人将要运行您不想弄乱的删除命令。如果您没有适当的备份,那么您的数据就不存在了。
答案2
将您的代码放入脚本中(您正在编写脚本,对吗?)并授予用户sudo
访问该脚本的权限。
最终它看起来可能像这样:
#!/bin/bash
for kill_this_disk in /sys/block/sd[b-i]/device/delete
do
echo 1 > $kill_this_disk
done
并且,我希望您有好的备份。
答案3
我不认为 **operator ALL=/sys/block/sdb/device/delete ** 能够让您以非 root 身份访问该设备。sudoers 允许您指定以 sudo 身份运行时不会查询密码的命令(例如此处的“tee”)。您的问题来自 /sys/block/$hd/device/delete 的权限...
答案4
也许您需要在 sudoers 配置文件中使用 NOPASSWD 选项。我相信语法是这样的:
operator ALL=NOPASSWD:/sys/block/sdb/device/delete