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

Bha*_*wan 244 sudo password

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

但是,我想在不输入密码的情况下运行三个sudo命令

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

如何从密码保护中排除这些命令sudo

mgd*_*mgd 327

使用NOPASSWD指令

您可以NOPASSWD/etc/sudoers文件中使用该指令。

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

user host = (root) NOPASSWD: /sbin/shutdown
user host = (root) NOPASSWD: /sbin/reboot
Run Code Online (Sandbox Code Playgroud)

这将允许用户userhost不输入密码的情况下运行所需的命令。所有其他sudoed 命令仍然需要密码。

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

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

user host = (root) NOPASSWD: /home/someuser/bin/
Run Code Online (Sandbox Code Playgroud)

注意:始终使用该命令visudo编辑sudoers文件以确保您不会将自己锁定在系统之外 - 以防万一您不小心向sudoers文件中写入了不正确的内容。visudo会将修改后的文件保存到临时位置,并且只有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 
Run Code Online (Sandbox Code Playgroud)

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

如果sudoers乱了

如果你不习惯visudo编辑你的文件然后不小心把文件弄乱了/etc/sudoers或者把文件弄乱了/etc/sudoers.d那么你就会被锁在外面sudo

解决方案可能是修复文件使用pkexecwhich 是sudo.

修复/etc/sudoers

pkexec visudo
Run Code Online (Sandbox Code Playgroud)

修复/etc/sudoers.d/shutdown

pkexec visudo -f /etc/sudoers.d/shutdown
Run Code Online (Sandbox Code Playgroud)

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

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

$ ls -l /etc/sudoers.d/shutdown 
-r--r----- 1 root root 86 Jul 16 15:37 /etc/sudoers.d/shutdown
Run Code Online (Sandbox Code Playgroud)

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

pkexec chown root:root /etc/sudoers.d/shutdown
pkexec chmod 0440 /etc/sudoers.d/shutdown
Run Code Online (Sandbox Code Playgroud)

  • @StanKurdziel 我在 Mac OS X Yosemite 上尝试了这条线,它运行良好:`mgd ALL=(root) NOPASSWD: /var/root/test`。我是用户 `mgd`,`ALL` 表示 _“来自所有主机”_。`/var/root/test` 是一个简单的“Hello World”shell 脚本,具有以下权限:`-rwx------ 1 root wheel 27 12 Jun 09:54 /var/root/test`。我_没有_对系统进行了其他更改。 (4认同)
  • sudoers 文件中的“host”是什么? (3认同)
  • 这不是一个答案,它几乎是有关 NOPASSWD 指令的完整指南。谢谢。 (3认同)
  • 这两行特指这两个命令。如果 `user` 没有以其他方式授予 `sudo` 权限,则该用户不能执行其他命令。看看“man sudo”和“man sudoers”。 (2认同)
  • @Michael 请阅读手册页。一切都写在那里。引用它:但是,您也可以指定命令行参数(包括通配符)。或者,您可以指定“”以指示该命令只能在没有命令行参数的情况下运行。 (2认同)

Owl*_*Owl 13

对不起,但对此有太多的困惑和一些非常复杂的答案,我觉得我必须在有人误解并做一些疯狂的事情之前权衡一下。

使用视觉!!

将以下行添加到配置中:

ALL ALL=NOPASSWD: /sbin/reboot,/sbin/shutdown
Run Code Online (Sandbox Code Playgroud)

这允许从任何用户执行带有任何参数的命令、重启和关机。第一个“ALL”是指用户,所以它的意思是所有用户。第二个 ALL 是指所有主机。

有关更详细的解释,请参阅man sudoers这提供了更多示例,这些示例向下几页,但如果您深入挖掘,它们实际上就在那里。

请堆栈交换,只给出简单,简洁的答案。

  • 有*一个*其他答案。将此答案与另一个答案进行比较:另一个答案解释了如何在一台主机上为一个用户进行设置;对多个用户和多个主机的泛化是显而易见的。您的回答给出了一个神奇的咒语(实际上适用于所有用户或所有主机,但这完全不明显)。另一个区别是您的答案在一行中给出了两个命令。我不知道你可以这样做 - 它有点用,但考虑到 sudoers 的复杂性,我怀疑我会永远使用它。 (2认同)