Linux中國

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

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

Linux su 命令

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 命令的好處和壞處:

  • 有的時候,對於系統管理員(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 的互動式程序。

參考示例:

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

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

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

示例中的 shell 類型將會被目標用戶在 /etc/passwd 文件中定義的登錄 shell 類型所替代。

sudo vs. su

現在,我們已經討論了關於 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 用戶身份運行,這意味著它不會再要求輸入任何密碼。

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

sudo passwd root

結論

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

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

作者:Himanshu Arora 譯者:zhb127 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
1
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國