我编写了一个脚本来帮助清理我的下载和动漫,但如果没有root它就无法运行。
因此我尝试将其添加到 /etc/sudoers(使用 techraf 的建议进行编辑):
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
Cmnd_Alias FILEPERM_CMDS = /bin/chown, /bin/chmod
# User privilege specification
root ALL=(ALL:ALL) ALL
myUsernane ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/down.sh
myUsernane ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/rehamer.sh
myUsernane ALL=(ALL) NOPASSWD: /bin/chown
myUsernane ALL=(ALL) NOPASSWD: /bin/chmod
myUsernane ALL=(ALL) NOPASSWD: FILEPERM_CMDS
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
但这不起作用......
脚本内容如下:
sudo chown -cR myUsername:users $downloads $anime >>"$default"logs/own.log 2>&1
echo owned
sudo chmod -cR 664 $anime >>"$default"logs/mod.log 2>&1
sudo chmod -cR 765 $downloads >>"$default"logs/mod.log 2>&1
sudo find $downloads $anime -type d -exec chmod a+x {} \; >>"$default"logs/mod.log 2>&1
echo moded
rm -vrf $downloads*.ignore >>"$default"logs/rm.log 2>&1
echo removed ignored files
如果我在脚本中保留 sudo,它会要求我输入一次密码,然后就可以正常工作。如果我从脚本中删除 sudo,它会在不输入密码的情况下运行,但我仍然会Permissions denied
反复收到错误。您如何解决这个问题?
答案1
通过添加以下内容sudoers
:
myUsername ALL=(ALL) NOPASSWD: /path/to/down.sh
您已允许以提升的权限myUsername
运行/path/to/down.sh
脚本。这意味着您可以发出以下命令:
sudo /path/to/down.sh
使用提升的权限运行整个脚本就足够了,并且不会要求输入密码。您不需要添加额外的sudo
forchown
或,chmod
因为这些命令将从脚本继承权限(但在这种情况下,sudo chown
运行不会出现问题,因为root
具有运行所有命令而无需输入密码的权限)。
这是一种可能的方法。
另一种方法...
您未允许在 中myUsername
运行chown
或。如果您想以普通用户身份运行脚本,并且只允许以 身份运行某些命令,则应在 中指定所有命令,例如:chmod
sudoers
root
sudoers
myUsername ALL=(ALL) NOPASSWD: /usr/sbin/chown
你的二进制文件路径可能会有所不同
或指定命令别名:
Cmnd_Alias FILEPERM_CMDS = /usr/sbin/chown, /usr/sbin/chmod
myUsername ALL=(ALL) NOPASSWD: FILEPERM_CMDS
这样您就可以按原样使用您的脚本。
最后,您已在 下指定了权限# User alias specification
。这只是一个良好的实践建议,但这不是本节的内容。您最好将其添加到# User privilege specification
。
看一下sudoers 示例对于一些常见的场景。
答案2
一种可能性是让脚本本身具有 sudo 权限。将以下内容添加到 /etc/sudoers:
myUsername ALL=(ALL) NOPASSWD: /path/to/down.sh
然后在脚本的开头添加如下内容:
#!/bin/bash
# If not already running as root, rerun via sudo
if [ $(id -u) -ne 0 ]; then
exec sudo "$BASH_SOURCE" "$@"
exit $? # in case something fails...
fi
只要文件路径与 /etc/sudoers 中的条目匹配,它就应该能够透明地以 root 身份重新运行自身(因此您可以sudo
在脚本的其余部分省略 s)。如果由于某种原因不匹配,您将收到sudo
's 密码提示。