在编写一些自动化脚本的时候,需要以root权限执行某些命令,这时候通过修改/etc/sudoers来实现免密执行sudo命令是一个比较好的办法。

查看用户所在组

lab@testlink:~$ groups
lab adm cdrom sudo dip plugdev lxd

可以看到用户lab在lab,sudo...等等组里

配置sudoers

lab@testlink:~$ sudo vim /etc/sudoers
...

# 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
%lab    ALL=(ALL:ALL) NOPASSWD:ALL

...

关键部分如上,在/etc/sudoers中加入一行
%lab ALL=(ALL:ALL) NOPASSWD:ALL
这表示lab这个组下的用户可以免密以sudo执行命令

注:
为什么不直接加入lab这个用户免密而是要加入组呢?这是由于用户lab还在sudo这个组里面,%sudo组的配置会覆盖用户的配置,即使配置了用户免密,依然要输入密码

部分命令免密

如果不希望lab用户能以sudo免密执行所有命令,如何操作?比如只希望免密执行sudo apt update,操作如下:

lab@testlink:~$ sudo vim /etc/sudoers
...
# Cmnd alias specification
Cmnd_Alias SCMD=/usr/bin/apt update

# 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
%lab    ALL=(ALL:ALL) NOPASSWD:SCMD
...
  • 添加Cmnd_Alias SCMD=/usr/bin/apt update
  • 修改%lab ALL=(ALL:ALL) NOPASSWD:ALL中的ALLSCMD(对应上面的Cmnd_Alias中的命名)

这样lab就只能免密执行sudo apt update,其他的命令因为lab还处在sudo组里面,所以也还是能执行的,只是需要密码,匹配%sudo ALL=(ALL:ALL) ALL 这条规则