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解释的那样:“您可以指定”“以指示该命令只能在没有命令行参数的情况下运行。 ”                        

                                        
改进这个答案                                        

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

      

macos

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

这一行命令的作用

这一行命令是一个 sudoers 文件中的配置,主要用于控制用户在使用 sudo 命令时的权限。具体来说:

  • ALL ALL:这部分指定了哪些用户在什么主机上具有这些权限。这里的第一个 ALL 表示所有用户,第二个 ALL 表示所有主机。

  • NOPASSWD::这意味着该用户在执行后面的命令时不需要输入密码。

  • /sbin/reboot,/sbin/shutdown:这部分指定了可以执行的命令,分别是 /sbin/reboot (重启系统)和 /sbin/shutdown (关闭系统)。

总结起来,这行命令的作用是:允许所有用户在任何主机上执行 /sbin/reboot 和 /sbin/shutdown 命令,而无需输入密码。这种配置在某些情况下可能会提高便利性,但也会带来一定的安全风险,因为任何用户都可以在不被授权的情况下重启或关闭系统。

第二个ALL 到表示 所有主机, 到底是什么 意思


sudoers文件的上下文中,第二个ALL实际上并不直接表示“所有主机”,这是一个常见的误解。在sudoers文件的权限规则中,字段的含义通常是这样的:

复制代码

用户或用户组 主机名=(运行用户):命令

但是,当你看到像ALL ALL=NOPASSWD: /sbin/reboot,/sbin/shutdown这样的规则时,它实际上是这样被解析的:

  • 第一个ALL:这指的是用户或用户组。在这个例子中,它表示这条规则适用于系统上所有的用户。

  • 第二个ALL(在=之前):这指的是主机名。然而,在大多数sudoers文件的配置中,这个字段被设置为ALL是为了表示这条规则适用于任何主机,但这实际上在单机系统上并没有太大的实际意义,因为sudo命令是在本地机器上执行的。在分布式系统或网络环境中,这个字段可能用于限制哪些远程主机上的用户可以执行特定的sudo命令,但在大多数桌面和服务器环境中,它通常被设置为ALL

  • NOPASSWD::这是一个选项,表示执行后面列出的命令时不需要密码。

  • /sbin/reboot,/sbin/shutdown:这是允许用户无需密码即可执行的命令列表。

因此,第二个ALL在这里确实指的是主机名,但在单机环境中,它主要是一个占位符,表示这条规则没有基于主机名的限制。在更复杂的环境中,这个字段可以用来根据用户连接到系统的位置(即主机名或IP地址)来限制sudo权限。

总结一下,第二个ALLsudoers文件中的意思是“这条规则适用于任何主机”,但在单机环境中,这通常是一个默认的、无实际限制的设置。


adminuser ALL=NOPASSWD: /sbin/reboot,/sbin/shutdown adminuser 到底指的是用户组 还是用户

在 sudoers 文件的上下文中,adminuser 通常指的是一个用户的名称,而不是用户组的名称。sudoers 文件用于定义哪些用户或用户组可以运行哪些命令,以及是否需要密码。

当你看到这样的行

bash复制代码

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

表示的是:

  • adminuser:这是一个具体的用户名称,而不是用户组。

  • ALL:这表示该规则适用于所有主机(但在单机环境中主要是个占位符)。

  • NOPASSWD::这表示当用户 adminuser 尝试执行后面列出的命令时,不需要输入密码。

  • /sbin/reboot,/sbin/shutdown:这是用户 adminuser 可以无密码执行的命令列表。

如果你想要指定一个用户组而不是单个用户,你需要使用用户组的名称,并且通常还需要在组名前加上 % 符号。但是,请注意,并非所有系统都支持直接在 sudoers 文件中为用户组授予权限(尽管这取决于sudo的版本和配置)。在一些系统上,你可能需要通过将用户添加到具有适当 sudo 权限的用户组中来间接授予权限。

然而,在大多数情况下,如果你想要为特定用户组授予权限,你会在 /etc/sudoers 文件中看到类似于这样的行(假设你的系统支持这种语法):

bash复制代码

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

但请注意,admingroup 在这里是一个假设的用户组名称,你需要将其替换为你系统中实际存在的用户组名称。此外,并非所有 sudo 实现都支持直接在 sudoers 文件中使用 % 前缀来指定用户组;这取决于你的系统配置和 sudo 的版本。如果你的系统不支持这种语法,你可能需要通过其他方式(如使用别名或编辑 PAM 配置)来实现类似的功能。但在大多数现代 Linux 发行版中,上述语法是有效的。