释义
su 意为switch user ,也就是切换用户,主要参数为“-”,也就是常见的两种切换方式
[test1@localhost root]$ su - test2
[test2@localhost ~]$ su root
两种方法只差了一个字符 -
,会有比较大的差异:
-
如果加入了
-
参数,那么是一种login-shell
的方式,意思是说切换到另一个用户<user_name>
之后,当前的 shell 会加载<user_name>
对应的环境变量和各种设置; -
如果没有加入
-
参数,那么是一种non-login-shell
的方式,意思是说我现在切换到了<user_name>
,但是当前的 shell 还是加载切换之前的那个用户的环境变量以及各种设置。 -
su
命令不跟任何<user_name>
,默认切换到 root 用户
案例讲解
用户test2以 non-login-shell
的方式切换到 root 用户,比较两种用户状态下环境变量中 PWD
的值
[test2@localhost ~]$ su
Password:
[root@localhost test2]# env|grep PWD
PWD=/home/test2
可以看到我们是切换到 root 用户了,但是 shell 环境中的变量并没有改变,还是用之前 ubuntu 用户的环境变量。接着我们从 ubuntu 用户以 login-shell
的方式切换到 root 用户,同样比较两种用户转台下环境变量中 PWD
的值:
[root@localhost test2]# su test2
[test2@localhost ~]$ env | grep PWD
PWD=/home/test2
[test2@localhost ~]$ su - root
Password:
Last login: Mon Nov 29 17:12:19 CST 2021 on pts/2
[root@localhost ~]# env | grep PWD
PWD=/root
可以看到用 login-shell
的方式切换用户的话,shell 中的环境变量也跟着改变了。
总结
具体使用哪种方式切换用户看个人需求:
-
如果不想因为切换到另一个用户导致自己在当前用户下的设置不可用,那么用
non-login-shell
的方式; -
如果切换用户后,需要用到该用户的各种环境变量(不同用户的环境变量设置一般是不同的),那么使用
login-shell
的方式。具体的事例就是mysql安装后切换mysql用户就要用到这种方式。
扩展
一般来说,我们执行从一个用户1切换到另一个用户2,执行完命令后执行exit,就可以返回用户1,用户2可以是root
[root@localhost ~]# exit
logout
[test2@localhost ~]$
还有一种方式是:不需要先切换用户再执行命令,可以直接在当前用户下,以另一个用户的方式执行命令,执行结束后就返回当前用户。这就得用到 -c
参数。
具体使用方法是:
su - -c "指令串" # 以 root 的方式执行 "指令串"
[test2@localhost ~]$ env | grep PWD
PWD=/home/test2
[test2@localhost ~]$ su -c "env|grep PWD"
Password:
PWD=/home/test2
[test2@localhost ~]$ su - -c "env|grep PWD"
Password:
PWD=/root