272                    
               

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

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

  • sudo reboot

  • sudo shutdown -r now

  • sudo shutdown -P now

如何将这些命令排除在密码保护之外sudo                    

                                   
改进这个问题                                    
       

3 个回答 正确答案                    

       
353                        
                   

使用NOPASSWD指令                        

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

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

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

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

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

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

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

如果 /etc/sudoers 文件 或  见下面的 /etc/sudoers.d/shutdown 文件弄错,出问题  见 /node-admin/19013                        

注意:始终使用命令visudo来编辑sudoers文件,以确保您不会将自己锁定在系统之外——以防万一您不小心向文件写入了不正确的内容sudoersvisudo会将修改后的文件保存到一个临时位置,并且只有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
                   
                                       
改进这个答案                                        
  • 3个                                    
    这两行特指这两个命令。如果user没有以其他方式授予sudo权限,则该用户不能执行其他命令。看看man sudoman sudoers 
    – 毫克                                        
     2012 年 7 月 5 日 15:27                                    
  • 5个                                    
    @StanKurdziel 我在 Mac OS X Yosemite 上尝试过这一行,它运行良好:mgd ALL=(root) NOPASSWD: /var/root/test我是用户mgdALL意思是“来自所有主机”/var/root/test是一个简单的“Hello World”shell 脚本,具有以下权限:-rwx------  1 root  wheel  27 12 Jun 09:54 /var/root/test没有对系统进行其他更改。 
    – 毫克                                        
     2015 年 6 月 12 日 8:02                                     
  • 5个                                    
    hostsudoers 文件中有什么? 
    – 用户106563                                        
     2016 年 10 月 20 日 14:02                                    
  • 3个                                    
    这不是答案,它几乎是关于 NOPASSWD 指令的完整指南。谢谢。 
    – 埃雷                                        
     2017 年 8 月 14 日 20:10                                    
  • 2个                                    
    @Michael 请阅读手册页。都写在那里了。引用它:但是,您也可以指定命令行参数(包括通配符)。或者,您可以指定 "" 以指示该命令只能在没有命令行参数的情况下运行。 
    – 毫克                                        
     2017 年 8 月 31 日 18:35                                     
       
24                        
                   

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

使用 visudo!!                        

visudo
正确答案
                       

将以下行添加到配置中:                        

ALL ALL=NOPASSWD: /sbin/reboot,/sbin/shutdown
                       

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

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

请stackexchange,给出简单、简洁的答案。                        

                                       
改进这个答案                                        
  • 3个                                    
    还有一个答案。将此答案与另一个答案进行比较:另一个答案解释了如何在一台主机上为一个用户设置;对多个用户和多个主机的概括是显而易见的。您的回答给出了一个神奇的咒语(实际上适用于所有用户或所有主机,但这完全不明显)。另一个区别是您的答案在一行中给出了两个命令。我不知道你能做到这一点——它有点用处,但考虑到 sudoers 的复杂性,我怀疑我永远不会使用它。 
    – 马丁邦纳支持莫妮卡                                        
     2020 年 1 月 13 日 10:21                                    
  • 你有我。visudo只编辑 sudoers 文件。所有重要的和未注释的都在ALL. 
    – 亚罗姆拉克斯                                        
     2021 年 2 月 18 日 12:38                                    
  • @Owl 请提供确切的步骤。 
    – 导航                                        
     2022 年 4 月 17 日 14:52                                    
       
1个                        
                   

提到设置主机的答案让我感到困惑,因为我希望能够让sudo用户能够运行特权命令而无需考虑这种“主机方面”;任何主机都应该工作,因此我使用特殊的ALL保留字。                        

假设您希望所有sudo用户(即 Unix 组sudo成员的 Unix 用户)以超级用户root )身份运行以下命令而无需输入密码:                        

  • sudo iftop

  • sudo dbus-monitor --system

首先使用以下命令找出可执行文件的完整路径which                        

  • which iftop>/usr/sbin/iftop

  • which dbus-monitor>/usr/bin/dbus-monitor

假设主sudo配置文件etc/sudoers包含以下指令(Ubuntu 默认值)...                        

#includedir /etc/sudoers.d
                       

...那么最佳做法是将您的配置添加到目录中其自己的单独文件中/etc/sudoers.d/,例如/etc/sudoers.d/customizations这样,当对原始sudo包的更新想要更改原始/etc/sudoers文件并且包管理器注意到您所做的编辑有冲突时,您不会遇到问题。                        

运行以下命令来创建和编辑您自己的sudo自定义文件:                        

sudo visudo -f /etc/sudoers.d/customizations
                       

使用该visudo命令可确保在保存文件时文件中没有语法错误 - 否则语法错误会使sudo无法读取其所有配置文件,从而破坏任何后续sudo使用,有效地将您锁定在任何超级用户使用之外,包括修复语法错误。                        

现在将以下行添加到此文件并保存:                        

%sudo ALL=NOPASSWD: /usr/sbin/iftop
%sudo ALL=NOPASSWD: /usr/bin/dbus-monitor --system
                       

这些行开头的 表示它们是组 (" ") sudo%sudo的所有成员的规则%                        

对sudo配置文件的更改(包括目录中的新文件)/etc/sudoers.d/会立即生效 - 无需 sudo“重启”。                        

现在注意运行以下命令时会发生什么:(出于测试目的,任何当前的sudo票证,即不需要重新输入密码的时间跨度,可以通过执行直接撤销/超时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组中的所有用户运行以下命令而无需询问他们的密码......                        

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用户现在也可以sudo reboot ... 使用任何参数、标志和参数运行,而无需提供密码,包括 eg sudo reboot --poweroff --force如果不需要这样做,而是只允许sudo reboot 没有任何参数/标志/参数,则必须将其配置行更改为...                        

%sudo ALL=NOPASSWD: /usr/sbin/reboot ""
                       

...因为正如所man sudoers解释的那样:“您可以指定”“以指示该命令只能在没有命令行参数的情况下运行。 ”                        

                                       
改进这个答案                                        

不是您要找的答案?浏览其他标记的问题                或者问你自己的问题