我已经搜索并找到了许多答案,但我仍然无法让它工作。这是在 Debian 9 系统上 - 我在配置文件中创建了一个别名和一个 shell 函数:
alias lscron='sudo crontab -u biuser -l'
function edcron
{
lckf=~biuser/edcron
if [[ -f $lckf ]]
then
echo $(cat $lckf) is editing
else
echo $(id -nu) > $lckf
sudo crontab -u biuser -e
rm $lckf
fi
}
它们按预期工作,但要求输入密码。我想让一些用户无需密码即可运行这些命令,因此我添加了类似以下内容/etc/sudoers
:
analytics root = cat /etc/sudoers
#
# 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:/snap/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
some.user ALL = NOPASSWD: /usr/bin/crontab -u biuser -e, /usr/bin/crontab -u biuser -l
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
我没有收到任何错误,但它要求输入密码;我该如何让它工作?
编辑
Matching Defaults entries for some.user on analytics:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User some.user may run the following commands on analytics:
(ALL : ALL) ALL
(root) NOPASSWD: /usr/bin/crontab -u biuser -e, /usr/bin/crontab -u biuser -l
(ALL : ALL) ALL
答案1
当多个条目与用户匹配时,将按顺序应用它们。如果有多个匹配项,则使用最后一个匹配项(不一定是最具体的匹配项)。
(来源)
(ALL : ALL) ALL
在您的情况下,输出中的最后一个是sudo -l
“wins”。
在该NOPASSWD
行之后sudoers
没有明确的说明(ALL : ALL) ALL
,但是有#includedir
。这不是评论. 中一定有(ALL : ALL) ALL
某个文件/etc/sudoers.d
与之匹配some.user
。
您的目标是在 的输出中没有 行(ALL : ALL) ALL
后面的内容。然后您的设置就可以正常工作了。NOPASSWD
sudo -l -U some.user
sudoers.d
您可以通过将该NOPASSWD
行放在后面来解决问题而无需更改文件#includedir
。这样,每当该行匹配时,它肯定是最后一个匹配。