如何在没有密码的情况下运行特定的 sudo 命令?

如何在没有密码的情况下运行特定的 sudo 命令?

在一台特定的机器上,我经常需要sudo不时运行命令。sudo大多数情况下,输入密码就可以了。

然而三个sudo命令我想跑无需输入密码

  • sudo reboot
  • sudo shutdown -r now
  • sudo shutdown -P now

我怎样才能将这些命令排除在密码保护之外sudo

答案1

使用NOPASSWD指令

您可以NOPASSWD在您的/etc/sudoers文件

如果您的用户被呼叫user并且您的主机被呼叫,host您可以将这些行添加到/etc/sudoers

user host = (root) NOPASSWD: /sbin/shutdown
user host = (root) NOPASSWD: /sbin/reboot

这将允许用户无需输入密码即可user运行所需的命令。所有其他hostsudoed 命令仍然需要密码。

sudoers文件中指定的命令必须完全合格(即使用要运行的命令的绝对路径),如sudoers手册页。提供相对路径被视为语法错误。

如果命令以尾随/字符结尾并指向目录,则用户将能够运行该目录中的任何命令(但不能运行其中的任何子目录中的命令)。在以下示例中,用户user可以运行目录中的任何命令/home/someuser/bin/

user host = (root) NOPASSWD: /home/someuser/bin/

笔记:始终使用命令visudo编辑sudoers文件以确保您不会锁定自己,以防万一您不小心将错误的内容写入文件sudoersvisudo将保存您修改后的文件到临时位置,并将仅有的sudoers如果修改后的文件能够被正确解析,则覆盖真实文件。

使用/etc/sudoers.d而不是修改/etc/sudoers

作为编辑文件的替代方法/etc/sudoers,您可以将这两行添加到新文件中,/etc/sudoers.d例如/etc/sudoers.d/shutdown。这是一种分离不同权限更改的优雅方法sudo,同时保持原始sudoers文件不变,以便于升级。

笔记:再次,你应该使用命令visudo编辑该文件以确保您不会将自己锁定在系统之外:

sudo visudo -f /etc/sudoers.d/shutdown 

这也自动确保新文件的所有者和权限设置正确。

如果sudoers搞砸了

如果您以前没有visudo编辑过您的文件然后不小心弄乱了/etc/sudoers或者弄乱了一个文件那么/etc/sudoers.d您将被锁定sudo

解决方案可能是使用以下方法修复文件pkexec这是 的替代方案sudo

修理/etc/sudoers

pkexec visudo

修理/etc/sudoers.d/shutdown

pkexec visudo -f /etc/sudoers.d/shutdown

如果任何文件的所有权和/或权限不正确sudoers,则该文件将被忽略,sudo因此在这种情况下,您可能也会发现自己被锁定。同样,您可以使用pkexec来修复此问题。

正确的权限应该是这样的:

$ ls -l /etc/sudoers.d/shutdown 
-r--r----- 1 root root 86 Jul 16 15:37 /etc/sudoers.d/shutdown

pkexec像这样使用来修复所有权和权限

pkexec chown root:root /etc/sudoers.d/shutdown
pkexec chmod 0440 /etc/sudoers.d/shutdown

答案2

抱歉,但这个问题引起了太多困惑,而且答案也非常复杂,所以我觉得我必须在这里发表一下看法,以免有人误解并做出疯狂的事情。

使用 visudo!!

visudo

将以下行添加到配置中:

ALL ALL=NOPASSWD: /sbin/reboot,/sbin/shutdown

这允许任何用户执行带有任何参数的命令、reboot 和 shutdown。第一个“ALL”指的是用户,因此它表示所有用户。第二个 ALL 指的是所有主机。

欲了解更详细的解释,请参阅man sudoers此处,因为此处提供了更多示例,这些示例位于下面几页,但如果您深入挖掘,它们实际上就在那里。

请使用 stackexchange,只给出简单、简洁的答案。

答案3

答案提到设置一个主持人让我很困惑,因为我希望能够有一个须藤用户能够运行特权命令而无需考虑这种“主机方面”;任何主机都应该可以工作,因此我使用了特殊的ALL保留字。

假设你想要全部须藤用户(即属于 Unix 组成员的 Unix 用户须藤)运行以下命令超级用户)而无需输入密码:

  • sudo iftop
  • sudo dbus-monitor --system

首先使用以下命令找出可执行文件的完整路径which

  • which iftop>/usr/sbin/iftop
  • which dbus-monitor>/usr/bin/dbus-monitor

假设主要须藤配置文件etc/sudoers包含以下指令(Ubuntu 默认)...

#includedir /etc/sudoers.d

... 那么最佳做法是将配置添加到/etc/sudoers.d/目录中自己的单独文件中,例如/etc/sudoers.d/customizations。这样,当更新原始配置时,您就不会遇到问题须藤包想要更改原始/etc/sudoers文件并且包管理器注意到您所做的冲突的编辑。

运行以下命令来创建并编辑你自己的须藤定制文件:

sudo visudo -f /etc/sudoers.d/customizations

使用该visudo命令可确保在保存文件时没有语法错误 - 否则语法错误会导致须藤无法读取所有配置文件,从而破坏任何后续sudo使用,有效地锁定您以防止任何超级用户使用,包括修复语法错误。

现在将以下行添加到此文件并保存:

%sudo ALL=NOPASSWD: /usr/sbin/iftop
%sudo ALL=NOPASSWD: /usr/bin/dbus-monitor --system

这些行开头的表示它们是组(“ ”)%sudo所有成员的规则%须藤

更改须藤配置文件(包括/etc/sudoers.d/目录中的新文件)立即生效 - 无需 sudo“restart”。

现在注意运行以下命令时会发生什么:(出于测试目的,任何当前须藤票,即不需要重新输入密码的时间段,可以通过执行直接撤销/超时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 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 reboot ... 带有任何参数、标志和参数无需提供密码,包括例如sudo reboot --poweroff --force。如果不需要,只需sudo reboot 没有任何参数/标志/参数应被允许,其配置行必须更改为......

%sudo ALL=NOPASSWD: /usr/sbin/reboot ""

... 因为正如man sudoers解释的那样:“您可以指定“”来表明该命令只能在没有命令行参数的情况下运行。

相关内容