点击“在看”开启你的时光旅程吧!

Linux系统作为多用户多任务的操作系统,在实际操作中,切换用户身份是常有的事。有时候要从普通用户切换到root用户执行授权命令,有时候要从root用户切花到普通用户启动某些服务,比如elasticsearch服务是拒绝root用户启动的。


Linux中切换用户身份的命令涉及两个:su命令和sudo命令,那么这两个命令有什么区别?该怎么用?su命令有何弊端?


su命令


su是最简单的身份切换命令,如下是su命令的具体用法以及功能

su命令:su [-lm] [-c "命令"] [用户名]   <= 方括号表示可以省略命令用法如下:su  <=省略用户名,默认切换到root用户su - 或者su -l  <=切换用户的同时读取新用户的配置文件su -m [用户名]或者su -p [用户名]  <=读取当前户配置文件su -c "命令" [用户名] <=以目标用户身份执行一次命令后又回到当前户


值得注意的是,如果要连带着环境配置完整的切换到新用户,则需要执行 su -或者su -l命令,我们可以使用 env  | grep 用户名 查看环境配置,比如env | grep root。

[root@VM_0_8_centos ~]# env | grep rootUSER=rootMAIL=/var/spool/mail/rootPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/softins/jdk1.8/bin:/root/binPWD=/rootHOME=/rootLOGNAME=root


su的用法中,最常见的两种应用场景:

  • 由root用户切换到普通用户执行命令,如启动某些服务

  • 由普通用户切换到root用户执行命令,如授权命令


开篇我们提到过,有些软件是拒绝root用户启动的,比如elasticsearch,所以需要我们以普通用户的身份执行命令

su -c "nohup ./elasticsearch&" user1 <=临时切换到ser1执行命令

当然你也可以su - user1,然后再执行启动命令,只不过那是下下策罢了。


有时候我们也需要临时切换到root用户,给某些目录或者文件授权,命令如下

命令:su -c "命令" root举个栗子:[user1@centos soft]$ su -c "chmod -R 777 /usr/local/soft/" rootPassword:    <=输入密码[user1@centos soft]$ ll  <=查看权限total 436028-rwxrwxrwx 1 root root      2640 Dec 11 16:17 docker-ce.repo-rwxrwxrwx 1 root root  29049540 Feb 23 11:46 elasticsearch-6.2.2.tar.gz-rwxrwxrwx 1 root root 194545143 Feb 23 11:15 jdk-8u241-linux-x64.tar.gz-rwxrwxrwx 1 root root  83415765 Feb 23 11:27 kibana-6.2.2-linux-x86_64.tar.gz-rwxrwxrwx 1 root root 139464029 Feb 23 11:45 logstash-6.2.2.tar.gz


到此,你可能已经发现su命令的问题所在了,普通用户切换到root用户居然需要root用户的密码,这会导致root密码流失,始终不是稳妥的办法。所以,sudo命令闪亮登场。



sudo命令


相比于su命令切换到root身份需要root密码,sudo命令切换到root身份时只需要输入当前身份的密码即可但只有/etc/sudoers配置文件中指定的用户才能执行sudo命令,root用户默认在该配置文件中。


sudo命令可以让你以新用户的身份执行某项任务,这个功能有点类似su -c "命令",用法如下:

sudo [-u 用户名] 单条命令   <=以新用户身份执行命令sudo [-u 用户名] sh -c "命令1;命令2;命令3" <=sh -c执行一串命令

由于/etc/sudoers配置文件有其特定语法,所以需要用visudo命令进行编辑,在保存退出时系统会检查sudoers的语法。


下面我举例说明sudo命令的几种用法。


让普通用户可以执行root用户的所有命令

[root@VM_0_8_centos ~]# visudo...省略...## Allow root to run any commands anywhereroot    ALL=(ALL)       ALL   <=系统默认user1   ALL=(ALL)       ALL   <=新增的,让ser1可以执行sudo命令...省略...
#user1代表用户账号,第一个ALL代表登录者的来源主机名,第二个(ALL)代表可#可切换的身份,第三个ALL表示可执行的命令


经过上述的更改,user1用户便可以通过sudo命令执行root用户的命令

#执行单条命令[user1@VM_0_8_centos local]$ sudo -u root mkdir test1

#加入sh -c,一次执行多条命令[user1@VM_0_8_centos local]$ sudo -u root sh -c "chmod -R 777 test1;ls"


让普通用户可以执行root用户的某些命令

如果普通用户可以执行所有的root命令,总归是不安全的,那在sudo命令授权是如何做限制呢?如下,

[root@VM_0_8_centos ~]# visudo...省略...## Allow root to run any commands anywhereroot    ALL=(ALL)       ALL   <=系统默认user1   ALL=(ALL)  !/usr/bin/passwd,!/usr/bin/passwd root,/usr/bin/passwd [A-Za-z]*  ...省略...


上述命令表示,user1用户可以切换到任何用户,可以执行"passwd 任意字符"命令,但对passwd root命令做了限制,防止普通用户更改了root密码。


到此,su命令和sudo命令的基本用法已经讲解完毕,关于sudo命令,还有设置别名、用户组等高级操作,如有需求,可单独咨询。


   ☆  END  ☆   

往期精选

一段Java程序的一生!

别找了,面试官会问的Java基础,都在这儿了

spring和springboot到底是什么关系?


扫码关注

领取视频资料

石墨烯