提到设置主机的答案让我感到困惑,因为我希望能够让sudo用户能够运行特权命令而无需考虑这种“主机方面”;任何主机都应该工作,因此我使用特殊的ALL
保留字。
假设您希望所有sudo用户(即 Unix 组sudo成员的 Unix 用户)以超级用户( root )身份运行以下命令而无需输入密码:
首先使用以下命令找出可执行文件的完整路径which
:
假设主sudo配置文件etc/sudoers
包含以下指令(Ubuntu 默认值)...
#includedir /etc/sudoers.d
...那么最佳做法是将您的配置添加到目录中其自己的单独文件中/etc/sudoers.d/
,例如/etc/sudoers.d/customizations
. 这样,当对原始sudo包的更新想要更改原始/etc/sudoers
文件并且包管理器注意到您所做的编辑有冲突时,您不会遇到问题。
运行以下命令来创建和编辑您自己的sudo自定义文件:
sudo visudo -f /etc/sudoers.d/customizations
使用该visudo
命令可确保在保存文件时文件中没有语法错误 - 否则语法错误会使sudo无法读取其所有配置文件,从而破坏任何后续sudo
使用,有效地将您锁定在任何超级用户使用之外,包括修复语法错误。
现在将以下行添加到此文件并保存:
%sudo ALL=NOPASSWD: /usr/sbin/iftop
%sudo ALL=NOPASSWD: /usr/bin/dbus-monitor --system
这些行开头的 表示它们是组 (" ") sudo%sudo
的所有成员的规则。%
对sudo配置文件的更改(包括目录中的新文件)/etc/sudoers.d/
会立即生效 - 无需 sudo“重启”。
现在注意运行以下命令时会发生什么:(出于测试目的,任何当前的sudo票证,即不需要重新输入密码的时间跨度,可以通过执行直接撤销/超时sudo -k
)
iftop
: 失败与You don't have permission to capture on that device (socket: Operation not permitted)
. 这是因为运行没有前缀的配置命令sudo
像往常一样没有特权。
sudo iftop
:此命令现在无需密码即可成功运行。
sudo iftop -B
(“以字节为单位显示带宽”):此命令也将在不需要密码的情况下成功运行,因为正如所man sudoers
解释的那样,“一个简单的文件名 [不带参数,在配置文件中] 允许用户使用他们想要的任何参数运行该命令愿。 ”
sudo dbus-monitor
: 系统将要求输入密码,因为如前所述,man sudoers
“如果 [命令,在配置文件中] 具有关联的命令行参数,则 [命令] 中的参数必须与用户在命令行中给出的参数完全匹配(或匹配通配符,如果有的话)。 ”
sudo dbus-monitor --system
:此命令现在无需密码即可成功运行。
sudo dbus-monitor --system --foo
: 系统将要求输入密码,因为参数与配置不匹配。
回到最初的问题,允许sudo组中的所有用户运行以下命令而无需询问他们的密码......
sudo reboot
sudo shutdown -r now
sudo shutdown -P now
...创建一个包含以下内容的 sudo 配置文件(假设可执行文件reboot
和的 Ubuntu 标准位置shutdown
):
%sudo ALL=NOPASSWD: /usr/sbin/reboot
%sudo ALL=NOPASSWD: /usr/sbin/shutdown -r now
%sudo ALL=NOPASSWD: /usr/sbin/shutdown -P now
请注意,通过此配置,任何sudo用户现在也可以sudo reboot ...
使用任何参数、标志和参数运行,而无需提供密码,包括 eg sudo reboot --poweroff --force
。如果不需要这样做,而是只允许sudo reboot
没有任何参数/标志/参数,则必须将其配置行更改为...
%sudo ALL=NOPASSWD: /usr/sbin/reboot ""
...因为正如所man sudoers
解释的那样:“您可以指定”“以指示该命令只能在没有命令行参数的情况下运行。 ”