如何通过sudoers为多个命令提供无需密码访问权限?

以下是我知道的:
我必须在sudoers文件中添加下面这行代码,以便为用户赋予特定任务的权限。
user_name ALL=NOPASSWD: /usr/bin/apt-get install

在这种情况下,我想给予该用户重新启动两个服务(即ApacheMySQL)的访问权限,并拥有所有安装权限。
使用上述语句,我已经给予了他所有的安装权限,现在我是否需要再添加两次相同的语句来授予服务的权限?还是可以将这些命令添加在同一行中,用逗号或其他方式分隔?
4个回答

我通过创建一个新的组来解决了这个问题,该组具有有限的管理员权限...该组的名称是LimitedAdmins,之后我更新了sudoers文件如下。
我追加的那一行是:
%LimitedAdmins ALL=NOPASSWD: /usr/bin/apt-get*, /etc/init.d/apache2 restart

这是完整的/etc/sudoers文件:
# This file MUST be edited with the 'visudo' command as root.    
#   
# Please consider adding local content in /etc/sudoers.d/ instead of directly modifying   his file.   
#   
# See the man page for details on how to write a sudoers file.  
# 
Defaults    env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL  

#includedir /etc/sudoers.d
%domain_name\\administrators ALL=(ALL) ALL
%LimitedAdmins ALL=NOPASSWD: /usr/bin/apt-get*, /etc/init.d/apache2 restart

这在您的系统是域或非域情况下都能完美运行。

你不应该在#includedir行之后放东西,对吗? - hamstar
@hamstar 嗨!是的,你说得对。虽然我在公司使用这个配置文件已经有两年多了,而且它运行得非常好。不过,我还是建议将最后两行放在#includedir之前。 - Hrish
10或者更好的是,将这两行文本放入新文件/etc/sudoers.d中,而不是编辑/etc/sudoers。 - tgharold
@tgharold 是的伙计!你说得对...这确实是一个比我建议的更好的选择... :) 感谢你的想法,我也会尝试在我的地方实施。 - Hrish
#includeDir是一个注释吗?还是它会自动包含,而注释只是提醒我们的作用? - HeatfanJohn
是的,这是一条注释,但我们应该取消注释并使用该路径对sudoer进行更改,因为这是@tgharold建议的最佳选项。 - Hrish
我认为你不应该使用apt-getsudo手册建议不要在命令后面使用,因为它们允许在apt-get之后输入_任何_文本,这可能导致安全问题(据我理解)。 - EdgeCaseBerg
2#include dir /etc/sudoers.d 不是一个注释,而是一个实际的配置参数。这就是为什么在井号后面缺少空格的原因。请参考:http://www.sudo.ws/man/1.8.13/sudoers.man.html - spkane
请注意每个命令前面和逗号符号后面的空格。这非常重要,否则你会得到“/etc/sudoers: syntax error near line XX”。 - Jruv

看起来逗号是你所需要的。
Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm ... user3 ALL= PRINTING 来源

我按照你提到的方法给了权限,但是我收到了以下错误信息。 E: 无法打开锁定文件 /var/lib/dpkg/lock - 打开失败(13: 权限被拒绝) E: 无法锁定管理目录(/var/lib/dpkg/),请确认你是否具有root权限?... 有人能帮忙解决这个问题吗? - Hrish
@Rishee 我回家后会尽力尝试一次 - Karthik T
我的文件夹中包含以下提到的内容。 - Hrish

用户权限规范

root ALL=(ALL:ALL) ALL

管理员组成员可以获得 root 权限

%admin ALL=(ALL) ALL

允许 sudo 组的成员执行任何命令

%sudo ALL=(ALL:ALL) ALL#include /etc/sudoers.d$ sudo nano /etc/sudoers %Domain_Name\administrators ALL=(ALL) ALL %Domain_Name\user.name ALL=NOPASSWD: /usr/bin/apt-get install, /etc/init.d/apache2 restart
- Hrish

FWIW,我也和楼主一样在想同样的问题,看起来你可以只是复制这些行,例如。
user_name ALL=NOPASSWD: cmd1
user_name ALL=NOPASSWD: cmd2
user_name ALL=NOPASSWD: cmd3

谢谢,这是对我来说最易读的,因为每行代表一个命令。非常简单。 - Kazuya Gosho

我最终做的是(与你寻找的类似):
## PRTG monitoring
Cmnd_Alias PRTG = /bin/cat /proc/loadavg, /bin/df, /var/prtg/scripts/check_proc.sh
prtg ALL = NOPASSWD: PRTG

在内部:/etc/sudoers.d/666-prtg (666,因为... 呃... prtg 是一个基于Windows的监控工具你知道的)