为什么 sudoers NOPASSWD 选项不起作用?

gat*_*ado 105 sudo

我在 /etc/sudoers 中有一个 NOPASSWD 行(用 编辑visudo

gatoatigrado    ALL=(ALL) NOPASSWD: /bin/set-slow-cpufreq
Run Code Online (Sandbox Code Playgroud)

然而,输出是,

gatoatigrado@coral:~> sudo -n /bin/set-slow-cpufreq
sudo: sorry, a password is required to run sudo
Run Code Online (Sandbox Code Playgroud)

这种命令适用于 OpenSuSE 机器,但不适用于 Ubuntu 11.10。我究竟做错了什么?

注意:我找不到任何相关的系统日志消息,例如通过tail -f /var/log/syslog.

编辑

这是/etc/sudoers。

Defaults    env_reset

# things I've tried copying from an opensuse machine
Defaults always_set_home
Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS XDG_SESSION_COOKIE"

root    ALL=(ALL:ALL) ALL
gatoatigrado ALL=NOPASSWD: /bin/set-slow-cpufreq
%admin ALL=(ALL) ALL
%sudo   ALL=(ALL:ALL) ALL
Run Code Online (Sandbox Code Playgroud)

enz*_*tib 174

您应该将该行放在具有组规则的行之后sudo,因为正如sudoers手册页所述:

   When multiple entries match for a user, they are applied in order.
   Where there are multiple matches, the last match is used (which is not
   necessarily the most specific match).
Run Code Online (Sandbox Code Playgroud)

  • 作为附加说明,这也适用于多个组中的用户:例如,用户在 **admin** 组和 **sudo** 组中,如果 **sudo** 的规则在 **admin** 之后,则**sudo** 规则覆盖两个组中用户的 **admin** 规则。 (5认同)
  • 谢谢!我将我的行添加到`/etc/sudoers` 的末尾,现在它可以工作了。对感兴趣的人的完整解释:https://techglimpse.com/ubuntu-sudoers-nopasswd-option-not-working/ (2认同)

jor*_*fus 10

也刚碰到这个。

我的情况是我正在设置一个可以无头运行的远程系统。我已启用全盘加密(否则具有物理访问权限的攻击者可以做他或她想做的任何事情)我只想使用公钥进行身份验证(我将取消设置密码,以便“拥有某些东西,知道某些东西”方案将是密码受保护的密钥对 --root 登录当然被完全禁用)

Ubuntu 安装程序会提示添加到组中的非 root 管理员用户sudo。然后我sudoers使用sudo visudo以下方法手动将自己添加到文件中:

my_username ALL=(ALL:ALL) NOPASSWD:ALL
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在笔记本电脑上使用 nopasswd,则在您走开时必须始终锁定您的计算机,否则在您起床将奶油放入咖啡时,偶然的攻击者可能会妥协很多

我仍然需要密码验证。

enzotib 的回答是了解正在发生的事情的关键。在输入我的用户名后,sudo 组显示在 sudoers 中。

我没有将我的条目移到 sudo 行下方,而是删除了我之前添加的行,然后添加NOPASSWD到条目中%sudo

这似乎有效。再次仅在您确实需要时才使用 nopasswd(在我的情况下,这正是我所需要的,对于大多数需要密码进行 sudo 活动的用户来说是最好的)

附加警告:始终使用 visudo 编辑 sudoers。(sudo visudo) 此外,将另一个窗口打开切换到 root 用户可以让您恢复在更改 sudoers 文件时可能犯的任何错误。

  • 不要做这样的笼统声明。在无头系统上,根本不希望设置登录密码(而是依靠密钥对)我启用了全盘加密,所以祝你好运那个 live cd。(顺便说一句,无论 sudoers 文件如何,您都可以在未加密的系统上做各种有趣的事情)此外,您无法写入我的 PATH 中的任何位置,而且我不会给您 shell除非我相信你不会试图颠覆系统。您的安全问题并非无效,它只是过时了,并不像您暗示的那样普遍适用。 (2认同)

dra*_*788 7

理想情况下,如果您正在自定义可以通过哪些命令运行,sudo您应该在单独的文件中进行这些更改,/etc/sudoers.d/而不是sudoers直接编辑文件。您还应该始终使用visudo编辑文件。

例子: sudo visudo -f /etc/sudoers.d/slowcpu

插入您的行授予权限: gatoatigrado ALL=NOPASSWD: /bin/set-slow-cpufreq

然后保存并退出,visudo如果您有任何语法错误,它会警告您。

您可以运行sudo -l以查看您的用户已被授予的权限,如果在输出中的NOPASSWD任何%groupyouarein ALL=(ALL) ALL命令之前出现任何特定于用户的命令,系统将提示您输入密码。

如果您发现自己创建了很多这样的 sudoers.d 文件,那么您可能希望创建以用户命名的文件,以便更容易可视化。请记住,文件名和规则在文件中的顺序非常重要,最后加载的将获胜,无论它比以前的条目宽松还是宽松。

您可以使用前缀 00-99 或 aa/bb/cc 来控制文件名排序,但也要记住,如果您有任何没有数字前缀的文件,它们将在编号文件之后加载,覆盖设置。这是因为根据您的语言设置,外壳程序首先使用“词法排序”对数字进行排序,然后在按“升序”排序时可能会交错大小写。

尝试运行printf '%s\n' {{0..99},{A-Z},{a-z}} | sortprintf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort查看您当前的语言是否打印AaBbCc等,ABC然后abc确定要使用的最佳“最后”字母前缀是什么。