来源:Jun Tao地址:
https://tanjuntao.github.io/
之前一直对 su
和sudo
这两个命令犯迷糊,最近专门搜了这方面的资料,总算是把两者的关系以及用法搞清楚了,这篇文章来系统总结一下 。
1. 准备工作因为本篇博客中涉及到用户切换,所以我需要提前准备好几个测试用户,方便后续切换 。
linux 中新建用户的命令是 useradd
,一般系统中这个命令对应的路径都在PATH
环境变量里,如果直接输入useradd
不管用的话,就用绝对路径名的方式:/usr/sbin/useradd
。
useradd
新建用户命令只有 root 用户才能执行,我们先从普通用户 ubuntu 切换到 root 用户(如何切换后文会介绍):
ubuntu@VM-0-14-ubuntu:~$ su -Password: # 输入 root 用户登录密码root@VM-0-14-ubuntu:~# useradd -m test_user # 带上 -m 参数root@VM-0-14-ubuntu:~# ls /hometest_user ubuntu # 可以看到 /home 目录下面有两个用户了
因为还没有给新建的用户 test_user
设置登录密码,这就导致我们无法从普通用户 ubuntu 切换到 test_user,所以接下来,我们需要用 root 来设置 test_user 的登录密码 。需要用到passwd
命令:
root@VM-0-14-ubuntu:~# passwd test_userEnter new UNIX password: # 输出 test_user 的密码Retype new UNIX password:passwd: password updated successfullyroot@VM-0-14-ubuntu:~#
接着我们输入 exit
退出 root 用户到 普通用户 ubuntu:
root@VM-0-14-ubuntu:~# exitlogoutubuntu@VM-0-14-ubuntu:~$
可以看到,命令提示符前面已经由 root
变成ubuntu
,说明我们现在的身份是ubuntu
用户 。
2. su 命令介绍及主要用法首先需要解释下 su
代表什么意思 。
之前一直以为 su
是super user
,查阅资料之后才知道原来表示switch user
。
知道 su
是由什么缩写来的之后,那么它提供的功能就显而易见了,就是切换用户 。
2.1 -
参数su
的一般使用方法是:
su <user_name>
或者
su - <user_name>
两种方法只差了一个字符 -
,会有比较大的差异:
- 如果加入了
-
参数,那么是一种login-shell
的方式,意思是说切换到另一个用户 <user_name> 之后,当前的 shell 会加载 <user_name> 对应的环境变量和各种设置;
- 如果没有加入
-
参数,那么是一种non-login-shell
的方式,意思是说我现在切换到了 <user_name>,但是当前的 shell 还是加载切换之前的那个用户的环境变量以及各种设置 。
我们首先从 ubuntu 用户以
non-login-shell
的方式切换到 root 用户,比较两种用户状态下环境变量中PWD
的值(su
命令不跟任何 <user_name> ,默认切换到 root 用户):ubuntu@VM-0-14-ubuntu:~$ env | grep ubuntuUSER=ubuntuPWD=/home/ubuntu # 是 /home/ubuntuHOME=/home/ubuntu# 省略......ubuntu@VM-0-14-ubuntu:~$ su # non-login-shell 方式Password: # 输入 root 用户登录密码root@VM-0-14-ubuntu:/home/ubuntu# env | grep ubuntuPWD=/home/ubuntu # 可以发现还是 /home/ubunturoot@VM-0-14-ubuntu:/home/ubuntu#
我们的确是切换到 root 用户了,但是 shell 环境中的变量并没有改变,还是用之前 ubuntu 用户的环境变量 。接着我们从 ubuntu 用户以
login-shell
的方式切换到 root 用户,同样比较两种用户转台下环境变量中PWD
的值:ubuntu@VM-0-14-ubuntu:~$ env | grep ubuntuUSER=ubuntuPWD=/home/ubuntu # 是 /home/ubuntuHOME=/home/ubuntu# 省略.......ubuntu@VM-0-14-ubuntu:~$ su - # 是 login-shell 方式Password:root@VM-0-14-ubuntu:~# env | grep rootUSER=rootPWD=/root # 已经变成 /root 了HOME=/rootMAIL=/var/mail/rootLOGNAME=rootroot@VM-0-14-ubuntu:~#
可以看到用 login-shell
的方式切换用户的话,shell 中的环境变量也跟着改变了 。总结:具体使用哪种方式切换用户看个人需求:
- 如果不想因为切换到另一个用户导致自己在当前用户下的设置不可用,那么用
non-login-shell
的方式;
- 如果切换用户后,需要用到该用户的各种环境变量(不同用户的环境变量设置一般是不同的),那么使用
login-shell
的方式 。
推荐阅读
- Linux内核时钟系统和定时器实现
- 怎么查贫血不贫血
- 鼠尾草味道和什么相似,马鞭草和鼠尾草怎么区别
- 勐海排名前十的茶厂,普洱茶的生茶和熟茶的区别
- 马鞭草怎么用效果最好,马鞭草和鼠尾草怎么区别
- 生普洱和熟普洱有啥区别,青柑普洱桔皮普洱陈皮普洱的区别
- 满族平时和节日的主要食品是什么?
- 沉香珠的收集和鉴定方法
- led电子显示屏的工作原理和功能
- 脚大拇指筋疼怎么回事