在 Ubuntu 20.04 中,我有这个配置。在 /etc/sudoers 中:
...
%sudo ALL=(ALL:ALL) ALL
...
我以这种方式改变了它:
...
%sudo ALL=(ALL:ALL) ALL
david ALL=(ALL) NOPASSWD: /usr/bin/systemctl hibernate
...
david
是我的用户名。我尝试了很多变体并搜索了互联网。每当我这样做时,我都需要输入密码:
sudo systemctl hibernate
对于 CentOS 和其他 Linux 变体,它可以正常工作。
更新 1:
sudo -ll
Matching Defaults entries for david on hp:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User david may run the following commands:
Sudoers entry:
RunAsUsers: ALL
RunAsGroups: ALL
Commands:
ALL
Sudoers entry:
RunAsUsers: ALL
Options: !authenticate
Commands:
/bin/systemctl hibernate
Sudoers entry:
RunAsUsers: ALL
Commands:
ALL
工作的其他系统的输出NOPASSWD:
是等效的。
要调试 sudo,请使用
sudo -ll
列出适用于用户的标志设置以及将针对任何命令检查匹配的所有条目。在设置中,
secure_path=
将显示将在哪些目录中搜索该命令。这通常包括/usr/bin
and/bin
,如果它只在其中一个中,您的条目将需要使用正确的目录。但是,在某些系统/bin
上是指向 的符号链接/usr/bin
,所以没关系。如果该命令与多个条目匹配,则将使用找到的最后一个。这有时意味着
NOPASSWD:
命令的显式条目被忽略,因为稍后有一个全局ALL=(ALL) ALL
条目覆盖它。通常,为避免这种情况,将显式条目放在 sudoers 文件的末尾或单独的单独包含文件中是有用的。