深入理解 sudo 與 su 之間的區別

2021-09-23 16:27:30 字數 3416 閱讀 6083

su命令的主要作用是讓你可以在已登入的會話中切換到另外乙個使用者。換句話說,這個工具可以讓你在不登出當前使用者的情況下登入為另外乙個使用者。

su命令經常被用於切換到超級使用者或 root 使用者(因為在命令列下工作,經常需要 root 許可權),但是 - 正如前面所提到的 - su 命令也可以用於切換到任意非 root 使用者。

如何使用su命令切換到 root 使用者,如下:

不帶命令列引數的 su 命令

如上,su命令要求輸入的密碼是 root 使用者的密碼。所以,一般su命令需要輸入目標使用者的密碼。在輸入正確的密碼之後,su命令會在終端的當前會話中開啟乙個子會話。

su -

還有一種方法可以切換到 root 使用者:執行su -命令,如下:

su - 命令

那麼,su命令與su -命令之間有什麼區別呢?前者在切換到 root 使用者之後仍然保持舊的(或者說原始使用者的)環境,而後者則是建立乙個新的環境(由 root 使用者~/.bashrc檔案所設定的環境),相當於使用 root 使用者正常登入(從登入螢幕登入)。

su命令手冊頁很清楚地說明了這一點:

可選引數-可提供的環境為使用者在直接登入時的環境。

因此,你會覺得使用su -登入更有意義。但是,su命令也是有用的,那麼大家可能會想知道它在什麼時候用到。以下內容摘自 archlinux wiki ** - 關於su命令的好處和壞處:

注意:如果你想在su -命令的-後面傳遞更多的引數,那麼你必須使用su -l而不是su -。以下是--l命令列選項的說明:

-,-l,--login提供相當於使用者在直接登入時所期望的環境。

當使用 - 時,必須放在su命令的最後乙個選項。其他選項(-l--login)無此限制。

su -c

還有乙個值得一提的su命令列選項為:-c。該選項允許你提供在切換到目標使用者之後要執行的命令。

su命令手冊頁是這樣說明:

-c,--command command使用-c選項指定由 shell 呼叫的命令。

被執行的命令無法控制終端。所以,此選項不能用於執行需要控制 tty 的互動式程式。

參考示例:

su

[target

-user]-

c [command-to

-run

]示例中,command-to-run將會被這樣執行:

[

shell

] -c

;[command-to

-run

]示例中的shell型別將會被目標使用者在/etc/passwd檔案中定義的登入 shell 型別所替代。

現在,我們已經討論了關於su命令的基礎知識,是時候來**一下sudosu命令之間的區別了。

關於密碼

兩個命令的最大區別是:sudo命令需要輸入當前使用者的密碼,su命令需要輸入 root 使用者的密碼。

很明顯,就安全而言,sudo命令更好。例如,考慮到需要 root 訪問許可權的多使用者使用的計算機。在這種情況下,使用su意味著需要與其他使用者共享 root 使用者密碼,這顯然不是一種好習慣。

此外,如果要撤銷特定使用者的超級使用者/root 使用者的訪問許可權,唯一的辦法就是更改 root 密碼,然後再告知所有其他使用者新的 root 密碼。

而使用sudo命令就不一樣了,你可以很好的處理以上的兩種情況。鑑於sudo命令要求輸入的是其他使用者自己的密碼,所以,不需要共享 root 密碼。同時,想要阻止特定使用者訪問 root 許可權,只需要調整sudoers檔案中的相應配置即可。

預設行為

兩個命令之間的另外乙個區別是其預設行為。sudo命令只允許使用提公升的許可權執行單個命令,而su命令會啟動乙個新的 shell,同時允許使用 root 許可權執行盡可能多的命令,直到明確退出登入。

因此,su命令的預設行為是有風險的,因為使用者很有可能會忘記他們正在以 root 使用者身份進行工作,於是,無意中做出了一些不可恢復的更改(例如:對錯誤的目錄執行rm -rf命令!)。關於為什麼不鼓勵以 root 使用者身份進行工作的詳細內容,請參考這裡。

日誌記錄

儘管sudo命令是以目標使用者(預設情況下是 root 使用者)的身份執行命令,但是它們會使用sudoer所配置的使用者名稱來記錄是誰執行命令。而su命令是無法直接跟蹤記錄使用者切換到 root 使用者之後執行了什麼操作。

靈活性sudo命令比su命令靈活很多,因為你甚至可以限制 sudo 使用者可以訪問哪些命令。換句話說,使用者通過sudo命令只能訪問他們工作需要的命令。而su命令讓使用者有許可權做任何事情。

sudo su

大概是因為使用su命令或直接以 root 使用者身份登入有風險,所以,一些 linux 發行版(如 ubuntu)預設禁用 root 使用者帳戶。鼓勵使用者在需要 root 許可權時使用sudo命令。

然而,您還是可以成功執行su命令,而不用輸入 root 使用者的密碼。執行以下命令:

sudo

su由於你使用sudo執行命令,你只需要輸入當前使用者的密碼。所以,一旦完成操作,su命令將會以 root 使用者身份執行,這意味著它不會再要求輸入任何密碼。

原文發布時間為:2017-04-14

深入理解C語言 深入理解記憶體四區

當陣列做函式引數的時候,會退化為乙個指標 此時在函式內是得不到陣列大小的 因此,陣列做函式引數的時候需要傳遞陣列大小,也就是多傳遞乙個引數 void func int arr,int num 若存在以上函式,c c 編譯器在編譯的時候,會將陣列優化為乙個指標,指向陣列的首位址,因此無法通過sizeo...

深入理解FT,DTFT,DFT 之間的關係

學習了數字訊號處理之後,被裡面的幾個名詞搞的暈頭轉向,比如dft dtft fs ft fft dfs等,參考整理的資料,重新寫了一下各種變換的概念。學過卷積,我們都知道有時域卷積定理和頻域卷積定理,在這裡只需要記住兩點 在乙個域的相乘等於另乙個域的卷積 與脈衝函式的卷積,在每個脈衝的位置上將產生乙...

深入理解緩衝區(九)

4.1.4.3 內外存位址是如何對映的 1 快取對應的內外存的對映關係 typedef struct buftag relfilenode rnode physical relation identifier 資料庫物件的位置標識,具體說明見下 forknumber forknum 可以檢視 rel...