Linux 命令 su 和 sudo 的区别?

来源:Jun Tao地址:
https://tanjuntao.github.io/
之前一直对 susudo这两个命令犯迷糊,最近专门搜了这方面的资料,总算是把两者的关系以及用法搞清楚了,这篇文章来系统总结一下 。
 
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代表什么意思 。
之前一直以为 susuper 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的方式 。
 


推荐阅读