提到设置主机的答案让我感到困惑,因为我希望能够让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解释的那样:“您可以指定”“以指示该命令只能在没有命令行参数的情况下运行。 ”