当前位置: 首页 > 后端技术 > Java

深入分析!linux命令su和sudo的区别

时间:2023-04-01 22:32:02 Java

之前一直对su和sudo这两个命令感到困惑。综上所述。准备因为本篇博客涉及用户切换,所以需要提前准备几个测试用户,方便后续切换。在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-mtest_user#带上-m参数root@VM-0-14-ubuntu:~#ls/hometest_userubuntu#可以看到/home目录下有两个user还没有为新建的用户test_user设置登录密码,导致我们无法从普通用户ubuntu切换到test_user,所以接下来需要使用root来设置test_user的登录密码。需要使用passwd命令:root@VM-0-14-ubuntu:~#passwdtest_userEnternewUNIXpassword:#outputthepasswordoftest_userRetypenewUNIXpassword:passwd:passwordupdatedsuccessfullyroot@VM-0-14-ubuntu:~#然后我们输入exit将root用户退出到普通用户ubuntu:root@VM-0-14-ubuntu:~#exitlogoutubuntu@VM-0-14-ubuntu:~$可以看到前面的命令提示符已经从root变成了ubuntu,说明我们当前的身份是ubuntu用户。su命令的介绍和主要用法首先需要解释一下su是什么意思。之前一直以为su是超级用户,后来查阅资料才知道原来是switch用户的意思。知道su是什么缩写后,它提供的功能就很明显了,就是切换用户。参数su的一般使用方法是:suorsu-两种方法的区别只有一个字符-,会有比较大的区别:如果加了-参数,那么就是alogin-shell方法,即切换到另一个用户后,当前shell会加载对应的环境变量和各种设置;如果不加-参数,那么就是非login-shell方法,意思就是我现在已经切换到了,但是当前的shell还是会加载切换前用户的环境变量和各种设置。单独解释会比较抽象,看个例子会更容易理解。我们先以非登录shell的方式从ubuntu用户切换到root用户,比较两种用户状态下环境变量中PWD的值(su命令不跟任何,切换到默认为root用户):ubuntu@VM-0-14-ubuntu:~$env|grepubuntuUSER=ubuntuPWD=/home/ubuntu#is/home/ubuntuHOME=/home/ubuntu#省略了……ubuntu@VM-0-14-ubuntu:~$su#非登录shell模式密码:#输入root用户登录密码root@VM-0-14-ubuntu:/home/ubuntu#env|grepubuntuPWD=/home/ubuntu#可以查到还是/home/ubunturoot@VM-0-14-ubuntu:/home/ubuntu#我们确实切换到了root用户,但是shell环境里面的变量没有变,而且还是用了之前ubuntu用户的环境变量。然后我们在login-shell模式下从ubuntu用户切换到root用户,比较两个用户的环境变量中PWD的值:ubuntu@VM-0-14-ubuntu:~$env|grepubuntuUSER=ubuntuPWD=/home/ubuntu#is/home/ubuntuHOME=/home/ubuntu#omitted.......ubuntu@VM-0-14-ubuntu:~$su-#是登录shell方法密码:root@VM-0-14-ubuntu:~#env|greprootUSER=rootPWD=/root#已经变成/rootHOME=/rootMAIL=/var/mail/rootLOGNAME=rootroot@VM-0-14-ubuntu:~#可以看到如果用login-shell切换用户,环境shell中的变量也会相应改变。总结:使用哪种方式切换用户看个人需求:如果不想因为切换到其他用户导致当前用户下的设置不可用,那么使用非登录shell方式;如果切换用户,需要用到用户的各种环境变量(不同用户的环境变量设置一般不一样),那么就用login-shell的方式。切换到指定用户之前已经介绍过,如果su命令后面没有任何,那么默认是切换到root用户:ubuntu@VM-0-14-ubuntu:~$su-Password:#root用户密码root@VM-0-14-ubuntu:/home/ubuntu#因为我们在1.准备部分新建了一个test_user用户,同时我们也知道了test_user用户的登录密码(root设置的)user),我们可以从ubuntu登录把用户切换成test_userUser:ubuntu@VM-0-14-ubuntu:~$su-test_userPassword:#test_user用户密码$-c在参数前面的方法中,我们都切换先到另一个用户(root或test_user),在which用户的状态下执行命令,最后输入exit回到当前ubuntu用户。另一种方式是:执行命令前不需要切换用户,直接在当前用户下以其他用户身份执行命令,执行完成后返回当前用户。这需要使用-c参数。具体使用方法是:su--c"commandstring"#以root身份执行"commandstring"我看个例子:ubuntu@VM-0-14-ubuntu:~$cat/etc/shadowcat:/etc/shadow:Permissiondenied#ubuntu用户不能直接查看/etc/shadow文件内容ubuntu@VM-0-14-ubuntu:~$su--c"tail-n4/etc/shadow"密码:#回车根用户密码ubuntu:$1$fZKcWEDI$uwZ64uFvVbwpHTbCSgim0/:18352:0:99999:7:::ntp:*:17752:0:99999:7:::mysql:!:18376:0:99999:7:::test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/:18406:0:99999:7:::ubuntu@VM-0-14-ubuntu:18406:0:99999:7:::ubuntu@VM-0-14-dountu:非常相似,并且是临时申请root用户权限。但是还是有区别的,以后再看吧。sudo命令介绍及主要用法首先解释一下sudo命令是什么意思。sudo的英文全称是superuserdo,即以超级用户(root用户)身份执行命令。这里的sudo和之前su代表的切换用户不同。这个需要注意,容易混淆。让我们从sudo命令可以做什么开始,然后解释为什么以及如何做。开始吧。主要用途我们在Linux中经常会遇到Permissiondenied,比如以ubuntu用户的身份查看/etc/shadow的内容。因为这个文件的内容只有root用户才能查看。那么如果我们要检查呢?这时候可以使用sudo:ubuntu@VM-0-14-ubuntu:~$tail-n3/etc/shadowtail:cannotopen'/etc/shadow'forreading:Permissiondenied#Nopermissionubuntu@VM-0-14-ubuntu:~$sudo!!#后跟两个感叹号sudotail-n3/etc/shadowntp:*:17752:0:99999:7:::mysql:!:18376:0:99999:7:::test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/:18406:0:99999:su:::ubuntu@VM-0-14$ubuntu在这个小例子中,我们使用!~表示重复上面输入的命令,但是在前面加上sudo命令。因为我已经设置了不输入密码的sudo命令,所以这里sudo!!可以直接输出内容。如果没有设置,则需要输入当前用户的密码。比如这个例子,我应该输入ubuntu用户的登录密码。如果相邻两次sudo操作间隔在5分钟以内,则第二次进入sudo时无需重新输入密码;如果超过5分钟,再次输入sudo时需要重新输入密码。所以更方便的方法是设置sudo操作不用密码。后面会介绍如何设置。除了以root用户权限执行命令外,sudo还有其他几种用法,这里简单介绍一下。切换到root用户:sudosu-这个方法在login-shell模式下也可以切换到root用户,但是和su-方法不同的是:前者输入sudosu-后需要提供login当前用户的密码,即ubuntu用户的密码;后者输入su-后需要提供root用户的登录密码。还有一个命令:sudo-i这个命令和sudosu-的作用一样,也是切换到root用户,同样需要提供当前用户(ubuntu用户)的登录密码。我们现在切换到test_user用户并尝试显示/etc/shadow文件的内容:ubuntu@VM-0-14-ubuntu:~$su-test_userPassword:#passwordfortest_user$sudocat/etc/shadow[sudo]passwordfortest_user:#test_user的密码test_user不在sudoers文件中。这个事件会被报告。$我们会在倒数第二行看到错误信息,我们无法查看/etc/shadow的内容。为什么?为什么ubuntu可以用sudo而不能用test_user?这就是sudo的工作原理。sudo的工作原理用户是否可以使用sudo命令取决于/etc/sudoers文件中的设置。从上一节我们看到ubuntu用户可以正常使用sudo,但是test_user用户不能,因为test_user没有在/etc/sudoers文件中配置。/etc/sudoers也是一个文本文件,但是由于其特定的语法,我们不需要使用vim或者vi直接编辑它,我们需要使用visudo命令。输入此命令后,您可以直接编辑/etc/sudoers文件。需要注意的是,只有root用户才有权限使用visudo命令。我们先看看输入visudo命令后显示的内容。Input(rootuser):root@VM-0-14-ubuntu:~#visudooutput:#用户权限说明rootALL=(ALL:ALL)ALL#admin组的成员可以获得root权限%adminALL=(ALL)ALL#允许sudo组的成员执行任何命令%sudoALL=(ALL:ALL)ALL#有关“#include”指令的更多信息,请参阅sudoers(5):#includedir/etc/sudoers.dubuntuALL=(ALL:ALL)NOPASSWD:ALL解释每一行的格式。第一个代表用户名,如root、ubuntu等;等号左边的ALL表示允许当前用户账号从任何主机登录;等号右边的ALL表示:本行开头的一个用户可以切换到系统中的任何其他用户;行尾的ALL表示:行首的用户以root用户身份可以发出什么命令,ALL表示可以发出任何命令。我们还注意到在ubuntu对应的行中有一个NOPASSWD关键字,意思是ubuntu用户在请求sudo时不需要输入密码,前面的问题在这里说明一下。同时我们注意到这个文件中并没有test_user对应的行,这也解释了为什么test_user不能使用sudo命令。接下来,我们尝试将test_user添加到/etc/sudoers文件中,以便test_user也可以使用sudo命令。我们在最后一行添加:test_userALL=(ALL:ALL)ALL#test_user需要提供test_user的密码才能使用sudo接下来,我们在test_user账号下执行sudo:ubuntu@VM-0-14-ubuntu:~$su-test_userPassword:$tail-n3/etc/shadowtail:无法打开'/etc/shadow'进行读取:权限被拒绝$sudotail-n3/etc/shadow#plussudontp:*:17752:0:99999:7:::mysql:!:18376:0:99999:7:::test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYbYW4VPxmTVHWRLYNGS/:184069$.思考我们已经看到,如果一个用户在/etc/sudoers文件中,那么它就有sudo权限,可以通过sudosu-或者sudo-i等命令切换到root用户,那么这个用户就变成了root用户了那么,这不是对系统构成了很大的威胁吗?它的确是。因此,如果编辑/etc/sudoers文件,为某个用户授予sudo权限,必须确保该用户是可信的,不会对系统造成恶意破坏。否则,将所有root权限授予用户,影响会非常大。危险。当然,root用户也可以编辑/etc/sudoers,让该用户只拥有部分权限,即只能执行少量的命令。我们已经看到了两者的区别:使用su-提供root账户的密码,可以切换到root用户;使用sudosu-提供当前用户的密码,也可以切换到root用户。两种方式的区别也很明显:如果我们的Linux系统有很多用户使用,前者要求所有用户都知道root用户的密码,这显然是非常危险的;后者不需要暴露root账户密码,用户只需要输入自己的账户密码即可,而且哪些用户可以切换到root完全由root控制(root是通过设置/etc/sudoers实现的),所以该系统更安全。一般推荐使用sudo方式。你学会了吗?如果有帮助,可以点击观看,转发朋友圈支持一下。来源:https://tanjuntao.github.io/