<code>su</code> 指令的主要作用是讓你可以在已登入的會話中切換到另外一個使用者。換句話說,這個工具可以讓你在不登出目前使用者的情況下登入為另外一個使用者。
<code>su</code> 指令經常被用于切換到超級使用者或 root 使用者(因為在指令行下工作,經常需要 root 權限),但是 - 正如前面所提到的 - su 指令也可以用于切換到任意非 root 使用者。
如何使用 <code>su</code> 指令切換到 root 使用者,如下:

不帶指令行參數的 su 指令
如上,<code>su</code> 指令要求輸入的密碼是 root 使用者的密碼。是以,一般 <code>su</code> 指令需要輸入目标使用者的密碼。在輸入正确的密碼之後,<code>su</code> 指令會在終端的目前會話中打開一個子會話。
<a target="_blank"></a>
還有一種方法可以切換到 root 使用者:運作 <code>su -</code> 指令,如下:
su - 指令
那麼,<code>su</code> 指令與 <code>su -</code> 指令之間有什麼差別呢?前者在切換到 root 使用者之後仍然保持舊的(或者說原始使用者的)環境,而後者則是建立一個新的環境(由 root 使用者 <code>~/.bashrc</code> 檔案所設定的環境),相當于使用 root 使用者正常登入(從登入螢幕登入)。
<code>su</code> 指令手冊頁很清楚地說明了這一點:
可選參數 <code>-</code> 可提供的環境為使用者在直接登入時的環境。
有的時候,對于系統管理者(root)來講,使用其他普通使用者的 shell 賬戶而不是自己的 root shell 賬戶更會好一些。尤其是在處理使用者問題時,最有效的方法就是是:登入目标使用者以便重制以及調試問題。
然而,在多數情況下,當從普通使用者切換到 root 使用者進行操作時,如果還使用普通使用者的環境變量的話,那是不可取甚至是危險的操作。因為是在無意間切換使用普通使用者的環境,是以當使用 root 使用者進行程式安裝或系統更改時,會産生與正常使用 root 使用者進行操作時不相符的結果。例如,以普通使用者安裝程式會給普通使用者意外損壞系統或擷取對某些資料的未授權通路的能力。
注意:如果你想在 <code>su -</code> 指令的 <code>-</code> 後面傳遞更多的參數,那麼你必須使用 <code>su -l</code> 而不是 <code>su -</code>。以下是<code>-</code> 和 <code>-l</code> 指令行選項的說明:
<code>-</code>, <code>-l</code>, <code>--login</code> 提供相當于使用者在直接登入時所期望的環境。 當使用 - 時,必須放在 <code>su</code> 指令的最後一個選項。其他選項(<code>-l</code> 和 <code>--login</code>)無此限制。
還有一個值得一提的 <code>su</code> 指令行選項為:<code>-c</code>。該選項允許你提供在切換到目标使用者之後要運作的指令。
<code>su</code> 指令手冊頁是這樣說明:
<code>-c</code>, <code>--command command</code> 使用 <code>-c</code> 選項指定由 shell 調用的指令。 被執行的指令無法控制終端。是以,此選項不能用于執行需要控制 tty 的互動式程式。
參考示例:
<code>su [target-user] -c [command-to-run]</code>
示例中,<code>command-to-run</code> 将會被這樣執行:
<code>[shell]&nbsp;-c&nbsp;[command-to-run]</code>
示例中的 <code>shell</code> 類型将會被目标使用者在 <code>/etc/passwd</code> 檔案中定義的登入 shell 類型所替代。
現在,我們已經讨論了關于 <code>su</code> 指令的基礎知識,是時候來探讨一下 <code>sudo</code> 和 <code>su</code> 指令之間的差別了。
兩個指令的最大差別是:<code>sudo</code> 指令需要輸入目前使用者的密碼,<code>su</code> 指令需要輸入 root 使用者的密碼。
很明顯,就安全而言,<code>sudo</code> 指令更好。例如,考慮到需要 root 通路權限的多使用者使用的計算機。在這種情況下,使用 <code>su</code> 意味着需要與其他使用者共享 root 使用者密碼,這顯然不是一種好習慣。
此外,如果要撤銷特定使用者的超級使用者/root 使用者的通路權限,唯一的辦法就是更改 root 密碼,然後再告知所有其他使用者新的 root 密碼。
而使用 <code>sudo</code> 指令就不一樣了,你可以很好的處理以上的兩種情況。鑒于 <code>sudo</code> 指令要求輸入的是其他使用者自己的密碼,是以,不需要共享 root 密碼。同時,想要阻止特定使用者通路 root 權限,隻需要調整 <code>sudoers</code> 檔案中的相應配置即可。
兩個指令之間的另外一個差別是其預設行為。<code>sudo</code> 指令隻允許使用提升的權限運作單個指令,而 <code>su</code> 指令會啟動一個新的 shell,同時允許使用 root 權限運作盡可能多的指令,直到明确登出。
盡管 <code>sudo</code> 指令是以目标使用者(預設情況下是 root 使用者)的身份執行指令,但是它們會使用 <code>sudoer</code> 所配置的使用者名來記錄是誰執行指令。而 <code>su</code> 指令是無法直接跟蹤記錄使用者切換到 root 使用者之後執行了什麼操作。
<code>sudo</code> 指令比 <code>su</code> 指令靈活很多,因為你甚至可以限制 sudo 使用者可以通路哪些指令。換句話說,使用者通過<code>sudo</code> 指令隻能通路他們工作需要的指令。而 <code>su</code> 指令讓使用者有權限做任何事情。
大概是因為使用 <code>su</code> 指令或直接以 root 使用者身份登入有風險,是以,一些 linux 發行版(如 ubuntu)預設禁用 root 使用者帳戶。鼓勵使用者在需要 root 權限時使用 <code>sudo</code> 指令。
然而,您還是可以成功執行 <code>su</code> 指令,而不用輸入 root 使用者的密碼。運作以下指令:
<code>sudo su</code>
由于你使用 <code>sudo</code> 運作指令,你隻需要輸入目前使用者的密碼。是以,一旦完成操作,<code>su</code> 指令将會以 root 使用者身份運作,這意味着它不會再要求輸入任何密碼。
原文釋出時間為:2017-04-14
本文來自雲栖社群合作夥伴“linux中國”