在一台特定的机器上,我经常需要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
运行所需的命令。所有其他host
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
这是 的替代方案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
解释的那样:“您可以指定“”来表明该命令只能在没有命令行参数的情况下运行。“