在新安装的CentOS系统中,使用默认创建的用户执行sudo
命令时终端报错:
xxx is not in the sudoers file. This incident will be reported.
报错原因
CentOS默认创建的用户并没有sudo
命令的执行权限,而且CentOS中也并不存在sudo
用户组。
不同于CentOS,Ubuntu在安装后默认创建的用户属于sudo
用户组,因此可以使用sudo
命令。
/etc/sudoers 文件简介
错误信息中提到的sudoers file位于/etc/sudoers
,root
用户使用visudo
命令可对其进行查看,最开始的文件介绍内容如下:
## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
##
## This file must be edited with the `visudo` command.
概括来说,sudoers
文件允许指定用户在运行命令时获取root权限而无需输入root密码。
根据最后一行,必须通过visudo
命令来对/etc/sudoers
文件进行编辑,该命令需要root权限。
sudoers
文件可对多种类型的命令权限及用户组权限进行授权,预设的命令包括网络管理、软件安装与管理、服务管理、数据库升级、存储管理、权限代理、进程管理、驱动管理等,预设的命令如下:
## Networking
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
## Installation and management of software
# Cmnd_Alias SOFTWARE = /bin/rom, /usr/bin/up2date, /usr/bin/yum
## Services
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
## Updating the locate database
# Cmnd_Alias LOCATE = /usr/bin/updatedb
## Storage
# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
## Delegating permissions
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
## Processes
# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe
解决办法
首先使用root
用户运行visudo
命令,打开/etc/sudoers
文件,找到如下所示的片段:
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple systems).
## Syntax:
##
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
以及
## Allow people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
可知有两种方法可让指定用户获取sudo
权限。
直接给指定用户授权
查阅网上相关博客,大多是基于此方法。例如用户名为test
,直接给test
用户授权,只需在root
用户的授权定义下添加相同的授权定义,将用户名改为test
:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allow test to run any commands anywhere
test ALL=(ALL) ALL
这种方法虽然简单却也比较极端:例如将test
用户删除后忘记删除sudoers
中的授权,之后再次新建同名账户的话,test
用户就直接获得了sudo
权限,存在安全隐患;而且每次新建用户后都需要再次添加授权定义,操作很麻烦,因此推荐使用下面的方法。
将指定用户加入wheel用户组
可以注意到,在sudoers
文件中可对wheel
用户组整体授权,因此可先将用户test
加入用户组wheel
中:
su - root
usermod -G wheel test
之后通过visudo
命令在sudoers
文件中对wheel
用户组进行授权,分为需要密码和无需密码两种方式,取消掉任意一种授权前面的注释即可:
## Allow people in group wheel to run all commands
%wheel ALL=(ALL) ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
保存文件并退出,问题解决。
测试一下
首先创建用户test
,并设置用户密码:
useradd test
id test
uid=502(test) gid=502(test) groups=502(test)
groups test
test : test
passwd test
切换至test
用户,尝试运行sudo visudo
命令,提示无sudo
权限:
[root@centos ~]$ su - test
[test@centos ~]$ sudo visudo
test is not in the sudoers file. This incident will be reported.
切换回root
用户,将test
加入wheel
用户组,再次尝试使用test
用户运行sudo visudo
命令,成功执行,问题解决!
[test@centos ~]$ su - root
[root@centos ~]$ usermod -G wheel test
[root@centos ~]$ id test
uid=502(test) gid=502(test) groups=502(test),10(wheel)
[root@centos ~]$ groups test
test : test wheel
[root@centos ~]$ su - test
[test@centos ~]$ sudo visudo
参考文章