**简介 **

现在互联网公司都会采用linux服务器去部署应用服务,例如反向代理服务(Nginx),数据库服务(mysql,db2,oracle),nosql(redis,memcached),有时候需要使用root用户去执行一些命令,例如mysql服务启停,db2实例创建等等,有没有可以让普通用户可以去执行root才有权限的命令呢,sudo命令可以。

sudo的作用 sudo设计之初让普通用户执行超级用户的权限,后来升级改造之后,sudo不仅可以执行root用户权限,还可以执行任何用户的权限。

设置sudo权限 让普通用户有sudo权限,配置其实很简单,使用root用户,在/etc/sudoers里添加一条配置就可以,可以使用vi/vim去编辑这个文件,如果特别熟悉这个配置,可以使用echo命令在这个配置文件添加一条配置。不过还是推荐大家使用visudo命令去编辑配置文件,因为visudo是有语法校验的,如果添加的配置不正确,是无法保存成功。

打开/etc/sudoers配置文件,找到以下配置

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

将“root ALL=(ALL) ALL”复制之后,将root用户修改成普通用户,保存就可以


## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
jim    ALL=(ALL)       ALL

测试效果 在没添加sudo配置之前,普通用户使用sudo时会报如下错误


[jim@localhost ~]$ sudo su - root
[sudo] password for jim: 
jim is not in the sudoers file.  This incident will be reported.
[jim@localhost ~]$

添加完配置之后,再次使用


[jim@localhost ~]$ sudo su - root
[sudo] password for jim: 
Last login: Mon Dec  2 10:37:29 CST 2019 on pts/0
[root@localhost ~]#

可以看到,输入完成jim的密码,就可以正常切换到root用户了,也可以用sudo cat /etc/sudoers这种方式去执行命令 在这里是不是发现了一些问题,在使用sudo su - root时,需要输入jim的用户密码,能不能想办法,在切换到root时,不用输入密码。在这里还是通过修改/etc/sudoers里的配置去实现。

将“jim ALL=(ALL) ALL”配置修改成“jim ALL=(ALL) NOPASSWD: ALL”,就可以实现切换root用户而无需输入密码,让运维变的更加简便,来看看修改之后的效果。


[jim@localhost ~]$ sudo su - root
Last login: Mon Dec  2 10:42:23 CST 2019 on pts/3
[root@localhost ~]#

写到这里,再介绍一个更高级的设置,能不能让普通用户可以sudo去执行root用户的权限,而不能切换到root用户,还是修改/etc/sudoers配置文件,将配置修改成如下所示


jim     ALL=(ALL)       ALL,!/bin/su

来测试一下配置效果


[jim@localhost ~]$ sudo su - root
Sorry, user jim is not allowed to execute '/bin/su - root' as root on localhost.localdomain.
[jim@localhost ~]$ sudo cat /root/test.log
test
[jim@localhost ~]$

可以看到jim用户已经无法切换到root用户了,但是可以用sudo去执行root才能权限执行的命令。

总结 sudo给我们运维带来什么便利,这里可以想象一下,如果有很多人需要有root用户权限去执行命令,不用sudo方式,而是告诉他们root密码,因为安全需要,修改root密码,就需要通知很多人,非常的不便利,额外带来很多工作,如果用sudo就没有这种问题。