当前位置: 首页>>技术问答>>正文


如何在没有密码的情况下运行特定的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

这将允许用户user在不输入密码的情况下在host上运行所需的命令。所有其他sudo ed命令仍将需要密码。

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

如果命令以尾随/字符结尾并指向目录,则用户将能够在该目录中运行任何命令(但不能在其中的任何sub-directories中)。在以下示例中,用户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修复ownership and permissions

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/233.html,未经允许,请勿转载。