1. 程式人生 > >[ARM-Linux開發]深入理解 sudo 與 su 之間的區別

[ARM-Linux開發]深入理解 sudo 與 su 之間的區別

早前的一篇文章中,我們深入討論了 sudo 命令的相關內容。同時,在該文章的末尾有提到相關的命令 su的部分內容。本文,我們將詳細討論關於 su 命令與 sudo 命令之間的區別。

在開始之前有必要說明一下,文中所涉及到的示例教程都已經在 Ubuntu 14.04 LTS 上測試通過。

Linux su 命令

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

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

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

不帶命令列引數的 su 命令

不帶命令列引數的 su 命令

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

su -

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

su - 命令

su - 命令

那麼,su 命令與 su - 命令之間有什麼區別呢?前者在切換到 root 使用者之後仍然保持舊的(或者說原始使用者的)環境,而後者則是建立一個新的環境(由 root 使用者 ~/.bashrc

 檔案所設定的環境),相當於使用 root 使用者正常登入(從登入螢幕登入)。

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

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

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

  • 有的時候,對於系統管理員(root)來講,使用其他普通使用者的 Shell 賬戶而不是自己的 root Shell 賬戶更會好一些。尤其是在處理使用者問題時,最有效的方法就是是:登入目標使用者以便重現以及除錯問題。
  • 然而,在多數情況下,當從普通使用者切換到 root 使用者進行操作時,如果還使用普通使用者的環境變數的話,那是不可取甚至是危險的操作。因為是在無意間切換使用普通使用者的環境,所以當使用 root 使用者進行程式安裝或系統更改時,會產生與正常使用 root 使用者進行操作時不相符的結果。例如,以普通使用者安裝程式會給普通使用者意外損壞系統或獲取對某些資料的未授權訪問的能力。

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

--l--login

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

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

su -c

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

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

-c--command COMMAND

使用 -c 選項指定由 Shell 呼叫的命令。

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

參考示例:


 
  1. su [target-user] -c [command-to-run]

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


 
  1. [shell] -c [command-to-run]

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

sudo vs. su

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

關於密碼

兩個命令的最大區別是: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 使用者的密碼。執行以下命令:


 
  1. sudo su

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

PS:如果你想在系統中啟用 root 使用者帳戶(強烈反對,因為你可以使用 sudo 命令或 sudo su 命令),你必須手動設定 root 使用者密碼,可以使用以下命令:


 
  1. sudo passwd root

結論

當你需要可用的工具來提升(或一組完全不同的)許可權來執行任務時,這篇文章以及之前的教程(其中側重於 sudo 命令)應該能給你一個比較好的建議。 如果您也想分享關於 su 或 sudo 的相關內容或者經驗,歡迎您在下方進行評論。


via: https://www.howtoforge.com/tutorial/sudo-vs-su/