之前一直对su和sudo这两个命令犯迷糊,最近专门搜了这方面的资料,总算是把两者的关系以及用法搞清楚了,这篇文章来系统总结一下。
1.准备工作
因为本篇博客中涉及到用户切换,所以我需要提前准备好几个测试用户,方便后续切换。
Linux中新建用户的命令是useradd,一般系统中这个命令对应的路径都在PATH环境变量里,如果直接输入useradd不管用的话,就用绝对路径名的方式:/usr/sbin/useradd。
useradd新建用户命令只有root用户才能执行,我们先从普通用户ubuntu切换到root用户(如何切换后文会介绍):
ubuntu
VM-0-14-ubuntu:~$su-Password:#输入root用户登录密码rootVM-0-14-ubuntu:~#useradd-mtest_user#带上-m参数rootVM-0-14-ubuntu:~#ls/hometest_userubuntu#可以看到/home目录下面有两个用户了因为还没有给新建的用户test_user设置登录密码,这就导致我们无法从普通用户ubuntu切换到test_user,所以接下来,我们需要用root来设置test_user的登录密码。需要用到passwd命令:
root
VM-0-14-ubuntu:~#passwdtest_userEnternewUNIXpassword:#输出test_user的密码RetypenewUNIXpassword:passwd:passwordupdatedsuccessfullyrootVM-0-14-ubuntu:~#接着我们输入exit退出root用户到普通用户ubuntu:
root
VM-0-14-ubuntu:~#exitlogoutubuntuVM-0-14-ubuntu:~$可以看到,命令提示符前面已经由root变成ubuntu,说明我们现在的身份是ubuntu用户。
2.su命令介绍及主要用法
首先需要解释下su代表什么意思。
之前一直以为su是superuser,查阅资料之后才知道原来表示switchuser。
知道su是由什么缩写来的之后,那么它提供的功能就显而易见了,就是切换用户。
2.1-参数
su的一般使用方法是:
suuser_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:~$envgrepubuntuUSER=ubuntuPWD=/home/ubuntu#是/home/ubuntuHOME=/home/ubuntu#省略......ubuntu
VM-0-14-ubuntu:~$su#non-login-shell方式Password:#输入root用户登录密码rootVM-0-14-ubuntu:/home/ubuntu#envgrepubuntuPWD=/home/ubuntu#可以发现还是/home/ubunturoot
VM-0-14-ubuntu:/home/ubuntu#我们的确是切换到root用户了,但是shell环境中的变量并没有改变,还是用之前ubuntu用户的环境变量。
接着我们从ubuntu用户以login-shell的方式切换到root用户,同样比较两种用户转台下环境变量中PWD的值:
ubuntu
VM-0-14-ubuntu:~$envgrepubuntuUSER=ubuntuPWD=/home/ubuntu#是/home/ubuntuHOME=/home/ubuntu#省略.......ubuntu
VM-0-14-ubuntu:~$su-#是login-shell方式Password:rootVM-0-14-ubuntu:~#envgreprootUSER=rootPWD=/root#已经变成/root了HOME=/rootMAIL=/var/mail/rootLOGNAME=rootroot
VM-0-14-ubuntu:~#可以看到用login-shell的方式切换用户的话,shell中的环境变量也跟着改变了。
总结:具体使用哪种方式切换用户看个人需求:
如果不想因为切换到另一个用户导致自己在当前用户下的设置不可用,那么用non-login-shell的方式;如果切换用户后,需要用到该用户的各种环境变量(不同用户的环境变量设置一般是不同的),那么使用login-shell的方式。
2.2切换到指定用户
前面已经介绍了,如果su命令后面不跟任何user_name,那么默认是切换到root用户:
ubuntu
VM-0-14-ubuntu:~$su-Password:#root用户的密码rootVM-0-14-ubuntu:/home/ubuntu#因为我们在1.准备工作部分已经新建了一个test_user用户,并且我们也知道test_user用户的登录密码(root用户设置的),我们就能从ubuntu用户切换到test_user用户:
ubuntu
VM-0-14-ubuntu:~$su-test_userPassword:#test_user用户的密码$2.3-c参数
前面的方法中,我们都是先切换到另一个用户(root或者test_user),在哪个用户的状态下执行命令,最后输入exit返回当前ubuntu用户。
还有一种方式是:不需要先切换用户再执行命令,可以直接在当前用户下,以另一个用户的方式执行命令,执行结束后就返回当前用户。这就得用到-c参数。
另外,Linux系列面试题和答案全部整理好了,