sudoers NOPASSWD 标签似乎不起作用

sudoers NOPASSWD 标签似乎不起作用

我正在调整我找到的脚本这里为了我自己的目的。

本质上,该脚本检查一些条件,然后使用 sudo 运行两个命令之一。该命令以用户身份执行cas

由于该脚本不会交互式运行,我想确保其中的 sudo 命令在没有密码提示的情况下执行。因此,我将以下几行添加到我的 sudoers 文件中:

ALL     ALL = NOPASSWD: /usr/bin/systemctl mask sleep.target suspend.target
ALL     ALL = NOPASSWD: /usr/bin/systemctl unmask sleep.target suspend.target

根据我对 sudoers 文件如何工作的理解,这意味着所有用户都可以执行命令/usr/bin/systemctl mask sleep.target suspend.target,而/usr/bin/systemctl unmask sleep.target suspend.target无需密码提示。

相反,密码提示仍然出现:

cas-desktop :: ~ » sudo /usr/bin/systemctl mask sleep.target suspend.target
[sudo] cas 的密码:
sudo:需要密码

我也尝试过不使用 sudo:

cas-desktop :: ~ » /usr/bin/systemctl mask sleep.target suspend.target
==== 对 org.freedesktop.systemd1.manage-unit-files 进行身份验证 ====
管理系统服务或单元需要身份验证文件。
身份验证为:Cas (cas)
密码:

我不知道还要做什么才能使这项工作成功,所以如果您有想法,请告诉我。

答案1

请运行sudo -l并查看是否sudo为您的用户定义了其他允许的命令行。这将显示全部适用的 sudoers 配置行,来自主配置和任何包含的/etc/sudoers.d/*文件(如果有)。

订购很重要:最后的可以匹配您的命令的行将被尊重。如果该行是(ALL : ALL) ALL没有NOPASSWD:标记的通用行,则您将要被要求输入密码。在这种情况下,请将NOPASSWD:- 标记的行移动到文件中较靠后的位置sudoers

如果 sudoers 文件的最后一行是@includedir /etc/sudoers.d,请考虑将 sudo 配置行移动到/etc/sudoers.d/.请注意,该目录中以字符结尾~或包含.字符的任何文件名会被忽略


或者,要在没有 的情况下允许它sudo,您需要编写一个polkit规则文件,例如/etc/polkit-1/rules.d/01-local-sleep-suspend.rules

// -*- mode: js2 -*-
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
         (action.lookup("unit") == "sleep.target" ||
          action.lookup("unit") == "suspend.target") &&
        subject.user == "cas") {
            return polkit.Result.YES;
    }
});

相关内容