让单个用户无需 sudo 密码即可执行命令

让单个用户无需 sudo 密码即可执行命令

我已经搜索并找到了许多答案,但我仍然无法让它工作。这是在 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后面的内容。然后您的设置就可以正常工作了。NOPASSWDsudo -l -U some.user

sudoers.d您可以通过将该NOPASSWD行放在后面来解决问题而无需更改文件#includedir。这样,每当该行匹配时,它肯定是最后一个匹配。

相关内容