问题描述
在一台特定的机器上,我经常需要每隔一段时间运行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
修复文件,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
修复ownership and permissions:
pkexec chown root:root /etc/sudoers.d/shutdown
pkexec chmod 0440 /etc/sudoers.d/shutdown