使用 sudoers 运行包含 sudo 命令的脚本

使用 sudoers 运行包含 sudo 命令的脚本

我编写了一个脚本来帮助清理我的下载和动漫,但如果没有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

使用提升的权限运行整个脚本就足够了,并且不会要求输入密码。您不需要添加额外的sudoforchown或,chmod因为这些命令将从脚本继承权限(但在这种情况下,sudo chown运行不会出现问题,因为root具有运行所有命令而无需输入密码的权限)。

这是一种可能的方法。


另一种方法...

您未允许在 中myUsername运行chown或。如果您想以普通用户身份运行脚本,并且只允许以 身份运行某些命令,则应在 中指定所有命令,例如:chmodsudoersrootsudoers

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 密码提示。

相关内容