深入理解 sudo 與 su 之間的區別
在開始之前有必要說明一下,文中所涉及到的示例教程都已經在 Ubuntu 14.04 LTS 上測試通過。
Linux su 命令
su
命令的主要作用是讓你可以在已登錄的會話中切換到另外一個用戶。換句話說,這個工具可以讓你在不登出當前用戶的情況下登錄為另外一個用戶。
su
命令經常被用於切換到超級用戶或 root 用戶(因為在命令行下工作,經常需要 root 許可權),但是 - 正如前面所提到的 - su 命令也可以用於切換到任意非 root 用戶。
如何使用 su
命令切換到 root 用戶,如下:
如上,su
命令要求輸入的密碼是 root 用戶的密碼。所以,一般 su
命令需要輸入目標用戶的密碼。在輸入正確的密碼之後,su
命令會在終端的當前會話中打開一個子會話。
su -
還有一種方法可以切換到 root 用戶:運行 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
命令的基礎知識,是時候來探討一下 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 用戶的密碼。運行以下命令:
sudo su
由於你使用 sudo
運行命令,你只需要輸入當前用戶的密碼。所以,一旦完成操作,su
命令將會以 root 用戶身份運行,這意味著它不會再要求輸入任何密碼。
PS:如果你想在系統中啟用 root 用戶帳戶(強烈反對,因為你可以使用 sudo
命令或 sudo su
命令),你必須手動設置 root 用戶密碼,可以使用以下命令:
sudo passwd root
結論
當你需要可用的工具來提升(或一組完全不同的)許可權來執行任務時,這篇文章以及之前的教程(其中側重於 sudo
命令)應該能給你一個比較好的建議。 如果您也想分享關於 su
或 sudo
的相關內容或者經驗,歡迎您在下方進行評論。
via: https://www.howtoforge.com/tutorial/sudo-vs-su/
作者:Himanshu Arora 譯者:zhb127 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive