我正在调整我找到的脚本这里为了我自己的目的。
本质上,该脚本检查一些条件,然后使用 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;
}
});