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

2021-02-23 Linux

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

在開始之前有必要說明一下,文中所涉及到的示例教程都已經在 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 網站[2] - 關於 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 用戶身份進行工作的詳細內容,請參考這裡[3]。

日誌記錄

儘管 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[4] 譯者:zhb127 校對:wxy

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

貢獻時間:2017-01-12 -> 2017-03-06

[1]: 早前的一篇文章 - https://www.howtoforge.com/tutorial/sudo-beginners-guide/

[2]: ArchLinux wiki 網站 - https://wiki.archlinux.org/index.php/Su

[3]: 這裡 - http://askubuntu.com/questions/16178/why-is-it-bad-to-login-as-root

[4]: Himanshu Arora - https://www.howtoforge.com/tutorial/sudo-vs-su/

相關焦點

  • Linux 命令 su 和 sudo 的區別?
    光解釋會比較抽象,我們看一個例子就比較容易理解了。首先還是解釋下 sudo 命令是什麼意思。sudo 的英文全稱是 super user do,即以超級用戶(root 用戶)的方式執行命令。這裡的 sudo 和之前 su 表示的 switch user 是不同的,這點需要注意,很容易搞混。
  • 面試被問 Linux 命令 su 和 sudo 的區別?
    光解釋會比較抽象,我們看一個例子就比較容易理解了。 首先還是解釋下 sudo 命令是什麼意思。sudo 的英文全稱是 super user do,即以超級用戶(root 用戶)的方式執行命令。這裡的 sudo 和之前 su 表示的 switch user 是不同的,這點需要注意,很容易搞混。
  • 面試:說說Linux 命令 su 和 sudo 的區別?
    光解釋會比較抽象,我們看一個例子就比較容易理解了。3. sudo 命令介紹及主要用法首先還是解釋下 sudo 命令是什麼意思。sudo 的英文全稱是 super user do,即以超級用戶(root 用戶)的方式執行命令。這裡的 sudo 和之前 su 表示的 switch user 是不同的,這點需要注意,很容易搞混。我們先介紹 sudo 命令能做什麼事情,然後說明為何能做到這些,以及如何做到這些。
  • Linux運維基礎 - su 和 sudo 命令
    1.su 命令1.1 命令簡介su 用於臨時切換身份到另一個指定的用戶,未指定用戶名默認為 root。使用 su 切換用戶身份後,默認情況下不改變當前工作目錄,但會改變 HOME、SHELL、USER、LOGNAME 等 Shell 的環境變量。1.2 命令格式su [OPTIONS] [-] [USER [ARG...]]
  • sudo 入門指南
    毫無疑問,sudo 是任何在 Linux 上使用命令行的人都必須知道的命令。但是,為了更負責、更有效地使用該命令,你還是要知道一些相關(及深入)的細節。這正是我們將會在這篇文章中討論的。在我們繼續之前,值得提一下的是,這篇文章所提到的所有命令指示都已經在 Ubuntu 14.04 LTS 下的 4.3.11 版 Bash 下通過測試。
  • linux之sudo使用技巧匯總
    sudo和su之間的區別sudo用於普通用戶可以使用root權限來執行命令su命令是當前用戶用來切換到另外一個用戶的命令,參數為用戶名。執行時會要求輸入密碼,這個密碼是你要切換到的用戶的密碼。sudo 表示 「superuser do」。它允許已驗證的用戶以其他用戶的身份來運行命令。其他用戶可以是普通用戶或者超級用戶。
  • 使用 pam 幫我們記錄su | sudo密碼
    audit/audit.log, 命令內容存放在data, 測試發現root 用戶截取的通常為明文, 其他帳戶截取的是 hex 加密的數據, 如 data=70617373776F72640Acat /var/log/audit/audit.logtype=USER_TTY msg=audit(1560480901.176:1894): pid=16680
  • Linux su命令的使用案例
    前言本文主要是講解與演示Linux系統中的su命令的使用與常見用法。Linux su命令的使用案例su命令也稱為switch user,翻譯為切換用戶。該命令用於在登錄會話期間把用戶身份切換到其他用戶。當沒有指定切換目標用戶名時,su默認切換到root用戶。正常來說,su命令用於在不退出系統的情況下將當前登錄的用戶切換到另一個用戶。
  • 每天都在敲的sudo命令,你真的了解嗎
    雖然 sudo 無疑是在 Linux 中使用命令行的任何人都必須知道的命令,但為了更負責任和有效地使用該命令,您還應該了解其他幾個相關(和深入)的細節。這正是我們將在本文中討論的內容。什麼是sudo sudo 表示 「superuser do」, 它允許已驗證的用戶以其他用戶的身份來運行命令。什麼是已驗證的用戶?現在大家可能不理解,簡單說就是我們可以通過自己設定的安全策略來給該用戶授權,未經授權的用戶沒法使用sudo命令。
  • 每天一個Linux命令(28):sudo
    介紹:sudo命令以系統管理者的身份執行指令,也就是說,經由 sudo 所執行的指令就好像是 root 親自執行不過要執行
  • linux系統管理指令Sudo出現重大漏洞!影響絕大多數Linux系統
    sudo是linux系統管理指令,是允許系統管理員讓普通用戶執行一些或者全部的root命令的一個工具,如halt,reboot,su
  • Linux中設置'sudo'的10個小技巧
    然而,承擔root用戶角色的系統管理員可以允許其他正常系統用戶在sudo命令和幾個配置的幫助下運行某些命令以及執行包括上述的一些重要系統操作。或者,系統管理員可以共享root用戶密碼(這不是推薦的方法),以便正常系統用戶可以通過su命令訪問root用戶帳戶。
  • 《入侵生命周期細分實踐指南》:sudo提權攻擊
    sudo是linux系統管理指令,是允許系統管理員讓普通用戶執行一些或者全部的root命令的一個工具,如halt,reboot,su等等。這樣不僅減少了root用戶的登錄 和管理時間,同樣也提高了安全性。sudo不是對shell的一個代替,它是面向每個命令的。
  • 深入理解 Linux socket
    撇開底層和協議細節,網絡通信和文件讀寫從接口上有本質區別嗎?其實沒啥區別,不就是讀過來和寫過去嘛,簡稱 IO 。我們先看一下 socket fd 是什麼樣子的?那說回來 socket 的可讀可寫事件就很容易理解了。
  • 關於 sudo 你可能不知道的 | Linux 中國
    大家都知道 sudo,對嗎?默認情況下,該工具已安裝在大多數 Linux 系統上,並且可用於大多數 BSD 和商業 Unix 變體。不過,在與數百名 sudo 用戶交談之後,我得到的最常見的答案是 sudo 是一個使生活複雜化的工具。有 root 用戶和 su 命令,那麼為什麼還要使用另一個工具呢?對於許多人來說,sudo 只是管理命令的前綴。
  • 使用sudo讓普通用戶獲取root用戶的權限
    ,su 等等。sudo不是對 shell 的一個代替,它是面向每個命令的。配置文件(/etc/sudoers)提供集中的用戶管理、權限與主機等參數驗證密碼的後5分鐘內(默認值)無須再讓用戶再次驗證密碼環境:Red Hat Enterprise Linux Server release 7.31.
  • 深入理解JVM內存區域
    因此,為了線程切換後能恢復到正確的執行位置,每條線程都需要有獨立的程序計數器,各線程之間的計數器互不影響。本地方法棧 與虛擬機棧作用相似,區別是虛擬機棧為Java方法服務,而本地方法棧為虛擬機使用到的Native方法服務。該區域也會拋出StackOverflowError 和OutOfMemoryError異常。4.
  • apt 和 apt-get 之間有什麼區別?
    那麼,apt-get 與 apt 命令之間到底有什麼區別呢?如果它們有類似的命令結構,為什麼還需要新的 apt 命令呢?一、 概念apt 和 apt-get 之間的區別1. Apt-getAdvanced Package Tool,又名apt-get,是一款適用於Unix和Linux系統的應用程式管理器。最初於1998年發布,用於檢索應用程式並將其加載到Debian Linux系統。
  • 深入理解 Linux的 I/O 系統
    收錄於話題 #深入理解此時數據還沒有真正的保存到文件中去,Linux 僅僅將頁緩存中的這一頁數據標記為 「髒」,並且被加入到髒頁鍊表中。然後,由 flusher 回寫線程周期性將髒頁鍊表中的頁寫到磁碟,讓磁碟中的數據和內存中保持一致,最後清理「髒」標識。在以下三種情況下,髒頁會被寫回磁碟:空閒內存低於一個特定閾值。髒頁在內存中駐留超過一個特定的閾值時。
  • A/D轉換器的解析度和準確度之間的區別
    要回答這個問題,關鍵在於從根本上理解解析度和準確度這兩個概念之間的區別。儘管這兩個術語是截然不同的,但它們卻經常被混淆或互換使用。  A/D轉換器的解析度被定義為輸入信號值的最小變化,可通過一次計數改變數字輸出值。就理想的A/D轉換器而言,傳遞函數呈階梯狀,且每個步階寬度等於解析度。