- 命令介绍
- 特别重要
- 常用选项
- su 命令存在的安全隐患
- 参考示例
- 切换成指定的用户身份,但是环境变量不变
- 切换成指定的用户身份,并且改成对应用户的环境变量
- 切换成指定的用户,并告知新的 shell 不要去读取启动文件
- 切换成指定的用户执行命令,执行后恢复原来的用户身份
- 切换成其它用户后,如何恢复成原来的用户身份
- 切换成 root 用户
su
英文就是 switch user
or substitute user identity
。su
命令用于切换当前用户身份到其他用户身份,或者以指定用户的身份执行命令或程序。
语法为 su
后接用户登录名称,接着系统会要求输入所要变更的用户的登录密码,成功登录后,命令行的前缀会改变,说明你已经切换成功。当然你也可以利用 who -m
命令来验证当前登陆的身份。
切换后,你会一直保持该用户身份,直至退出 Terminal 或者输入 exit 命令。
普通用户切换到 root 用户,可以使用 su -
或 su - root
,但是必须输入 root
密码才能完成切换。root 用户切换到普通用户,可以使用 su - username
,不需要输入任何密码即可完成切换。
使用命令 su
切换其它用户身份时,如果不指定选项 -
或 -l
或 --login
,这叫【非登录式】切换,即不会读取目标用户的配置文件,所以运行的用户环境还是原来用户的环境;如果指定了上述选项进行切换,这叫【登录式】切换,会读取目标用户的配置文件,切换后完全使用目标用户的环境执行命令,所以建议以后切换用户的时候都加上上述选项进行切换。
-c
或 --command=
执行完指定的指令后,即恢复原来的身份-f
或 --fast
适用于csh与tsch,使shell不用去读取启动文件(例如: csh.cshrc 等)-
或 -l
或 --login
改变身份时,也同时变更工作目录,以及环境变量 HOME、SHELL、USER、LOGNAME、PATH 等。这个参数加了之后,就好像是重新 login 为目标用户一样,大部份环境变量都是以目标用户的为主,并且工作目录也会改变。-m
或 -p
或 --preserve-environment
变更身份时,不要变更环境变量-s
或 --shell
指定要执行的shell--help
显示帮助信息--version
显示版本信息
su 命令存在的安全隐患
使用 su 命令可以让普通用户切换到 root 身份去执行某些特权命令,但存在一些问题,比如说: 1.仅仅为了一个特权操作就直接赋予普通用户超级管理员账户的完整权限,这显然是不明智的; 2.如果大家都要使用 su 命令切换到 root 身份,而使用命令 su 切换到 root 用户必须输入 root 的登录密码,这就导致很多人都知道 root 的密码,这是很糟糕的。
所以在实际的工作中,更多的是使用命令 sudo 来获取某些用户的特有权限去执行命令,而且普通用户必须通过授权才能使用命令 sudo。
参考示例 切换成指定的用户身份,但是环境变量不变例如,当前登录用户是 root,想要切换到 linuxcool 用户,但环境变量仍然是 root用户的:
[root@linuxcool ~]# su linuxcool
切换成指定的用户身份,并且改成对应用户的环境变量
切换成用户 linuxcool,并将工作目录以及相关的环境变量也改成用户 linuxcool 的:
[root@linuxcool ~]# su - linuxcool
说通俗点,命令 su -
是完整地切换到另一个用户环境,建议大家切换用户的时候,尽量使用 su - username
这样,否则可能发现某些命令执行不了。
[mysql@linuxcool ~]# su root -f
切换成指定的用户执行命令,执行后恢复原来的用户身份
当前登录用户是 mysql,切换成用户 root 执行命令 ls,命令执行完后恢复原来的用户身份:
[mysql@linuxcool ~]# su root -c ls
切换成其它用户后,如何恢复成原来的用户身份
切换成另一个用户身份之后,可以输入 exit 恢复成原来的用户身份。
例如,当前登录用户是 root,切换成用户 mysql:
[root@htlwk0001host ~]# su mysql -- 切换成用户 mysql
[mysql@htlwk0001host root]$
输入命令 exit,退出当前用户 mysql 身份,恢复成原来的用户身份 root:
[mysql@htlwk0001host root]$ exit -- 退出当前用户 mysql
exit
[root@htlwk0001host ~]#
切换成 root 用户
[mysql@htlwk0001host ~]$ su -
或
[mysql@htlwk0001host ~]$ su - root
或
[mysql@htlwk0001host ~]$ su # 不推荐这种方式,虽然切换成用户root了,但是运行的依旧是mysql的用户环境
[root@htlwk0001host mysql]# echo $USER
mysql
[root@htlwk0001host mysql]# echo $LOGNAME
mysql
[root@htlwk0001host mysql]# echo $PATH
/var/lib/mysql/.local/bin:/var/lib/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@htlwk0001host mysql]# echo $SHELL
/bin/bash