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

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

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

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

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

使用NOPASSWD指令

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

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

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

这将允许用户userhost上运行所需的命令而无需输入密码。 所有其他sudo ed命令仍然需要密码。

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

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

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

注意:始终使用命令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 

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

如果sudoers搞砸了

如果你没有使用visudo来编辑你的文件,然后不小心弄乱了/etc/sudoers或搞乱了/etc/sudoers.d的文件,那么你将被锁定在sudo

解决方案可能是使用pkexec修复文件, pkexecsudo的替代品。

修复/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