答案1
这不是“sudo”提示,而是“polkit”提示。避免它的一种方法是全局全部软件,而不仅仅是 systemctl – 是编写一个 polkit 规则,立即拒绝该操作(或立即允许它)。
polkit.addRule(function(action, subject) {
if (subject.user !== "root") {
if (/^org\.freedesktop\.systemd1\./.test(action.id)) {
return polkit.Result.NO;
}
}
});
(subject.user
可以省略测试,因为 root 调用的操作可以完全绕过 polkit 检查。)
polkit 规则存储在 中/etc/polkit/rules.d/*.rules
,通常命名为80-custom.rules
(按升序处理)。有关更多信息,请参阅波尔基特(8)。
(也就是说,如果你的 sudo 配置是无密码的,那么使用 'sudo' 与让 polkit 立即允许操作之间没有实际的安全差异。反之亦然,如果你的 sudo需要密码...那么为什么不直接将其输入到 polkit 对话框中呢?它是相同的密码。)
答案2
有一个选项--no-ask-password
。创建别名:
alias systemctl='systemctl --no-ask-password'
(在 Bash、Kubuntu 中测试)。
答案3
不要对 systemctl 使用 sudo,曾经; 如果你是允许进行维护,正确设置 polkit。
基本原理:sudo
使程序由请求的用户(通常:)有效运行root
。包括所有链接的工具包。程序、库或 ...sudo 配置中的任何错误都会让你受到攻击。在 的情况下systemd
,systemctl
二进制文件只是一个控制器(一般而言)。它才不是需要 root 权限(对于大多数用例),因为它本身不执行特权操作,而是要求init
。使用实际root
帐户(直接或通过sudo
)是全有或全无原子(炸弹)解决方案,而仅有的需要做的事情是授权(不:验证)反对systemd
.因为systemd
理解polkit
授权, 使用已认证root
授予的权限太多了。
考虑 中的一个错误systemctl
,它允许直接调用任意命令(不是通过systemd
)。当root
授予权限时sudo
,可以运行任何 EUID=0 的命令。以systemctl
非特权用户身份运行时,只能使用他之前获得访问权限的帐户运行此类命令。这是一些基本安全规则的简单结果:
- 仅使用所需的权限集(而不是全集 ==
root
), - 仅向需要它的代码授予这些权限(授权
systemd
而不授予权限systemctl
)。
至于成为机器的唯一用户 - 如果您使用非特权帐户工作,而不是一个root
帐户,我假设您想限制您运行的程序获得多余的权限。systemctl
仅因为root
帐户要authorized
命令而授予这些systemd
权限是多余的权限。
此外,polkit
您可以针对不同的操作(启动/停止/重新加载/其他)和不同的服务设置不同的访问标准。您可以在 中输入精确的命令sudoers
,但 polkit 解决方案知道这些命令的具体部分。
结论sudo
:如果有任何较低权限的方法可用,请不要使用。sudo
是全有或全无的最后手段解决方案。
如果您希望密码提示以文本而不是图形显示,只需取消设置显示,例如:解除终端与运行身份验证代理的图形会话的绑定。