<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux 命令 su 和 sudo 的區(qū)別?

          共 8703字,需瀏覽 18分鐘

           ·

          2021-11-14 03:24

          點擊上方“程序員大白”,選擇“星標”公眾號

          重磅干貨,第一時間送達

          來源:Jun Tao

          鏈接:https://tanjuntao.github.io/2020/05/23/Linux-學(xué)習(xí)記錄:su-和-sudo/


          之前一直對?su?和?sudo?這兩個命令犯迷糊,最近專門搜了這方面的資料,總算是把兩者的關(guān)系以及用法搞清楚了,這篇文章來系統(tǒng)總結(jié)一下。

          1、準備工作

          因為本篇博客中涉及到用戶切換,所以我需要提前準備好幾個測試用戶,方便后續(xù)切換。

          Linux 中新建用戶的命令是?useradd?,一般系統(tǒng)中這個命令對應(yīng)的路徑都在?PATH?環(huán)境變量里,如果直接輸入?useradd?不管用的話,就用絕對路徑名的方式:/usr/sbin/useradd?。

          useradd?新建用戶命令只有 root 用戶才能執(zhí)行,我們先從普通用戶 ubuntu 切換到 root 用戶(如何切換后文會介紹):

          ubuntu@VM-0-14-ubuntu:~$?su?-
          Password:?????????????????????????????????????????#?輸入?root?用戶登錄密碼
          root@VM-0-14-ubuntu:~#?useradd?-m?test_user???????#?帶上?-m?參數(shù)
          root@VM-0-14-ubuntu:~#?ls?/home
          test_user??ubuntu?????????????????????????????????#?可以看到?/home?目錄下面有兩個用戶了
          因為還沒有給新建的用戶?test_user?設(shè)置登錄密碼,這就導(dǎo)致我們無法從普通用戶 ubuntu 切換到 test_user,所以接下來,我們需要用 root 來設(shè)置 test_user 的登錄密碼。需要用到?passwd?命令:
          root@VM-0-14-ubuntu:~#?passwd?test_user
          Enter?new?UNIX?password:??????????????????????????#?輸出?test_user?的密碼
          Retype?new?UNIX?password:???????
          passwd:?password?updated?successfully
          root@VM-0-14-ubuntu:~#
          接著我們輸入?exit?退出 root 用戶到 普通用戶 ubuntu:
          root@VM-0-14-ubuntu:~#?exit
          logout
          ubuntu@VM-0-14-ubuntu:~$

          可以看到,命令提示符前面已經(jīng)由?root?變成?ubuntu,說明我們現(xiàn)在的身份是?ubuntu?用戶。

          2、su 命令介紹及主要用法

          首先需要解釋下?su?代表什么意思。

          之前一直以為?su?是?super user,查閱資料之后才知道原來表示?switch user

          知道?su?是由什么縮寫來的之后,那么它提供的功能就顯而易見了,就是切換用戶

          2.1?-?參數(shù)

          su?的一般使用方法是:

          su??

          或者

          su?-?
          兩種方法只差了一個字符?-,會有比較大的差異:

          光解釋會比較抽象,我們看一個例子就比較容易理解了。

          我們首先從 ubuntu 用戶以?non-login-shell?的方式切換到 root 用戶,比較兩種用戶狀態(tài)下環(huán)境變量中?PWD?的值(su?命令不跟任何 ,默認切換到 root 用戶):

          ubuntu@VM-0-14-ubuntu:~$?env?|?grep?ubuntu
          USER=ubuntu
          PWD=/home/ubuntu?????????????????????????????????????????#?是?/home/ubuntu
          HOME=/home/ubuntu
          #?省略......
          ubuntu@VM-0-14-ubuntu:~$?su??????????????????????????????#?non-login-shell?方式
          Password:????????????????????????????????????????????????#?輸入?root?用戶登錄密碼
          root@VM-0-14-ubuntu:/home/ubuntu#?env?|?grep?ubuntu
          PWD=/home/ubuntu?????????????????????????????????????????#?可以發(fā)現(xiàn)還是?/home/ubuntu
          root@VM-0-14-ubuntu:/home/ubuntu#

          我們的確是切換到 root 用戶了,但是 shell 環(huán)境中的變量并沒有改變,還是用之前 ubuntu 用戶的環(huán)境變量。

          接著我們從 ubuntu 用戶以?login-shell?的方式切換到 root 用戶,同樣比較兩種用戶轉(zhuǎn)臺下環(huán)境變量中?PWD?的值:

          ubuntu@VM-0-14-ubuntu:~$?env?|?grep?ubuntu
          USER=ubuntu
          PWD=/home/ubuntu???????????????????????????????#?是?/home/ubuntu
          HOME=/home/ubuntu
          #?省略.......
          ubuntu@VM-0-14-ubuntu:~$?su?-??????????????????#?是?login-shell?方式
          Password:
          root@VM-0-14-ubuntu:~#?env?|?grep?root
          USER=root
          PWD=/root??????????????????????????????????????#?已經(jīng)變成?/root?了
          HOME=/root
          MAIL=/var/mail/root
          LOGNAME=root
          root@VM-0-14-ubuntu:~#

          可以看到用?login-shell?的方式切換用戶的話,shell 中的環(huán)境變量也跟著改變了。

          總結(jié):具體使用哪種方式切換用戶看個人需求:

          • 如果不想因為切換到另一個用戶導(dǎo)致自己在當前用戶下的設(shè)置不可用,那么用?non-login-shell?的方式;
          • 如果切換用戶后,需要用到該用戶的各種環(huán)境變量(不同用戶的環(huán)境變量設(shè)置一般是不同的),那么使用?login-shell?的方式。

          2.2 切換到指定用戶

          前面已經(jīng)介紹了,如果?su?命令后面不跟任何 ,那么默認是切換到 root 用戶:

          ubuntu@VM-0-14-ubuntu:~$?su?-
          Password:???????????????????????????????????????#?root?用戶的密碼
          root@VM-0-14-ubuntu:/home/ubuntu#

          因為我們在?1. 準備工作?部分已經(jīng)新建了一個 test_user 用戶,并且我們也知道 test_user 用戶的登錄密碼(root 用戶設(shè)置的),我們就能從 ubuntu 用戶切換到 test_user 用戶:

          ubuntu@VM-0-14-ubuntu:~$?su?-?test_user
          Password:???????????????????????????????????????#?test_user?用戶的密碼
          $

          2.3?-c?參數(shù)

          前面的方法中,我們都是先切換到另一個用戶(root 或者 test_user),在哪個用戶的狀態(tài)下執(zhí)行命令,最后輸入?exit?返回當前 ubuntu 用戶。

          還有一種方式是:不需要先切換用戶再執(zhí)行命令,可以直接在當前用戶下,以另一個用戶的方式執(zhí)行命令,執(zhí)行結(jié)束后就返回當前用戶。這就得用到?-c?參數(shù)。

          另外,Linux 系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺發(fā)送:2T,可以在線閱讀。

          具體使用方法是:

          su?-?-c?"指令串"??????????????????????????????????#?以?root?的方式執(zhí)行?"指令串"
          我么看個例子:
          ubuntu@VM-0-14-ubuntu:~$?cat?/etc/shadow
          cat:?/etc/shadow:?Permission?denied????????????????#?ubuntu?用戶不能直接查看?/etc/shadow?文件內(nèi)容

          ubuntu@VM-0-14-ubuntu:~$?su?-?-c?"tail?-n?4?/etc/shadow"
          Password:??????????????????????????????????????????#?輸入?root?用戶密碼
          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:~$????????????????????????????#?執(zhí)行完馬上返回?ubuntu?用戶而不是?root?用戶
          這種執(zhí)行方式和后面要介紹的?sudo?很像,都是臨時申請一下 root 用戶的權(quán)限。但還是有差異,我們接著往后看。

          3、sudo 命令介紹及主要用法

          首先還是解釋下?sudo?命令是什么意思。

          sudo?的英文全稱是?super user do,即以超級用戶(root 用戶)的方式執(zhí)行命令。這里的?sudo?和之前?su?表示的?switch user?是不同的,這點需要注意,很容易搞混。

          我們先介紹?sudo?命令能做什么事情,然后說明為何能做到這些,以及如何做到這些。

          我們開始。

          3.1 主要用法

          我們在 Linux 中經(jīng)常會碰到?Permission denied?這種情況,比如以 ubuntu 用戶的身份查看?/etc/shadow?的內(nèi)容。因為這個文件的內(nèi)容是只有 root 用戶能查看的。

          那如果我們想要查看怎么辦呢?這時候就可以使用?sudo?:

          ubuntu@VM-0-14-ubuntu:~$?tail?-n?3?/etc/shadow
          tail:?cannot?open?'/etc/shadow'?for?reading:?Permission?denied??????#?沒有權(quán)限
          ubuntu@VM-0-14-ubuntu:~$?sudo?!!????????????????????????????????????#?跟兩個驚嘆號
          sudo?tail?-n?3?/etc/shadow
          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:~$

          實例中,我們使用了?sudo !!?這個小技巧,表示重復(fù)上面輸入的命令,只不過在命令最前面加上?sudo?。

          因為我已經(jīng)設(shè)置了?sudo?命令不需要輸入密碼,所以這里?sudo !!?就能直接輸出內(nèi)容。如果沒有設(shè)置的話,需要輸入當前這個用戶的密碼,例如本例中,我就應(yīng)該輸入 ubuntu 用戶的登錄密碼。

          兩次相鄰的?sudo?操作,如果間隔在?5min?之內(nèi),第二次輸入?sudo?不需要重新輸入密碼;如果超過?5min,那么再輸入?sudo?時,又需要輸入密碼。所以一個比較省事的方法是設(shè)置?sudo?操作不需要密碼。后面介紹如何設(shè)置。

          sudo?除了以 root 用戶的權(quán)限執(zhí)行命令外,還有其它幾個用法,這里做簡單介紹。

          切換到 root 用戶:

          sudo?su?-

          這種方式也能以?login-shell?的方式切換到 root 用戶,但是它和?su -?方法是由區(qū)別的:

          • 前者輸入?sudo su -?后,需要提供當前用戶的登錄密碼,也就是 ubuntu 用戶的密碼;
          • 后者輸入?su -?后,需要提供 root 用戶的登錄密碼。
          還有一個命令:
          sudo?-i

          這個命令和?sudo su -?效果一致,也是切換到 root 用戶,也是需要提供當前用戶(ubuntu 用戶)的登錄密碼。

          我們現(xiàn)在切換到 test_user 用戶,嘗試顯示?/etc/shadow?文件的內(nèi)容:

          ubuntu@VM-0-14-ubuntu:~$?su?-?test_user
          Password:???????????????????????????????????????#?test_user?的密碼
          $?sudo?cat?/etc/shadow
          [sudo]?password?for?test_user:??????????????????#?test_user?的密碼
          test_user?is?not?in?the?sudoers?file.??This?incident?will?be?reported.
          $

          我們會看到倒數(shù)第二行中的錯誤提示信息,我們無法查看?/etc/shadow?的內(nèi)容,這是為什么?為什么 ubuntu 可以使用?sudo?但是 test_user 不行呢?

          這就涉及到?sudo?的工作原理了。

          3.2?sudo?工作原理

          一個用戶能否使用?sudo?命令,取決于?/etc/sudoers?文件的設(shè)置。

          從 3.1 節(jié)中我們已經(jīng)看到,ubuntu 用戶可以正常使用?sudo?,但是 test_user 用戶卻無法使用,這是因為?/etc/sudoers?文件里沒有配置 test_user。

          /etc/sudoers?也是一個文本文件,但是因其有特定的語法,我們不要直接用?vim?或者?vi?來編輯它,需要用?visudo?這個命令。輸入這個命令之后就能直接編輯?/etc/sudoers?這個文件了。

          需要說明的是,只有 root 用戶有權(quán)限使用?visudo?命令。

          我們先來看下輸入?visudo?命令后顯示的內(nèi)容。

          輸入(root 用戶):

          root@VM-0-14-ubuntu:~#?visudo

          輸出:

          #?User?privilege?specification
          root????ALL=(ALL:ALL)?ALL

          #?Members?of?the?admin?group?may?gain?root?privileges
          %admin?ALL=(ALL)?ALL

          #?Allow?members?of?group?sudo?to?execute?any?command
          %sudo???ALL=(ALL:ALL)?ALL

          #?See?sudoers(5)?for?more?information?on?"#include"?directives:

          #includedir?/etc/sudoers.d
          ubuntu??ALL=(ALL:ALL)?NOPASSWD:?ALL

          解釋下每一行的格式:

          我們還注意到?ubuntu?對應(yīng)的那一行有個?NOPASSWD?關(guān)鍵字,這就是表明 ubuntu 這個用戶在請求?sudo?時不需要輸入密碼,到這里就解釋了前面的問題。

          同時我們注意到,這個文件里并沒有?test_user?對應(yīng)的行,這也就解釋了為什么 test_user 無法使用?sudo?命令。

          接下來,我們嘗試將 test_user 添加到?/etc/sudoers?文件中,使 test_user 也能使用?sudo?命令。我們在最后一行添加:

          test_user??ALL=(ALL:ALL)??ALL???????#?test_user?使用?sudo?需要提供?test_user?的密碼
          接下來我們再在 test_user 賬戶下執(zhí)行?sudo?:
          ubuntu@VM-0-14-ubuntu:~$?su?-?test_user
          Password:
          $?tail?-n?3?/etc/shadow
          tail:?cannot?open?'/etc/shadow'?for?reading:?Permission?denied
          $?sudo?tail?-n?3?/etc/shadow???????????????????#?加上?sudo
          ntp:*:17752:0:99999:7:::
          mysql:!:18376:0:99999:7:::
          test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/:18406:0:99999:7:::
          $
          可以看到,現(xiàn)在已經(jīng)可以使用?sudo?了。

          3.3 思考

          我們已經(jīng)看到了,如果一個用戶在?/etc/sudoers?文件中,那么它就具有?sudo?權(quán)限,就能通過?sudo su -?或者?sudo -i?等命令切換到 root 用戶了,那這時這個用戶就變成 root 用戶了,那這不對系統(tǒng)造成很大的威脅嗎?

          實際上的確是這樣的。所以如果在編輯?/etc/sudoers?文件賦予某種用戶?sudo?權(quán)限時,必須要確定該用戶是可信任的,不會對系統(tǒng)造成惡意破壞,否則將所有 root 權(quán)限都賦予該用戶將會有非常大的危險。

          當然,root 用戶也可以編輯?/etc/sudoers?使用戶只具備一部分權(quán)限,即只能執(zhí)行一小部分命令。有興趣的讀者可以參考 Reference 部分第二條,這篇文章不再贅述。另外,Linux 系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺發(fā)送:2T,可以在線閱讀。

          4、二者的差異對比

          我們已經(jīng)看到:

          • 使用?su -?,提供 root 賬戶的密碼,可以切換到 root 用戶;
          • 使用?sudo su -?,提供當前用戶的密碼,也可以切換到 root 用戶

          兩種方式的差異也顯而易見:如果我們的 Linux 系統(tǒng)有很多用戶需要使用的話,前者要求所有用戶都知道 root 用戶的密碼,這顯然是非常危險的;后者是不需要暴露 root 賬戶密碼的,用戶只需要輸入自己的賬戶密碼就可以,而且哪些用戶可以切換到 root,這完全是受 root 控制的(root 通過設(shè)置?/etc/sudoers?實現(xiàn)的),這樣系統(tǒng)就安全很多了。

          一般都是推薦使用?sudo?方式。

          References

          • https://www.rootusers.com/the-difference-between-su-and-sudo-commands-in-linux/
          • 《鳥哥的 Linux 私房菜》13.4 節(jié):使用者身份切換
          • https://github.com/ustclug/Linux101-docs/blob/master/docs/Ch05/index.md
          • https://www.maketecheasier.com/differences-between-su-sudo-su-sudo-s-sudo-i/
          • https://stackoverflow.com/questions/35999671/whats-the-difference-between-sudo-i-and-sudo-su?r=SearchResults
          • https://www.zhihu.com/question/51746286
          • https://www.linuxidc.com/Linux/2017-06/144916.htm

          13個你一定要知道的PyTorch特性

          解讀:為什么要做特征歸一化/標準化?

          一文搞懂 PyTorch 內(nèi)部機制

          張一鳴:每個逆襲的年輕人,都具備的底層能力


          關(guān)


          學(xué)西學(xué)學(xué)質(zhì)結(jié)關(guān)[]學(xué)習(xí)


          瀏覽 53
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中国一级片操逼的 | 日韩无码高清电影 | 最新在线看黄 | 天天射中文网 | 日韩中文字幕在线观看 |