Shell

是否有充分的理由執行 sudo su?

  • December 17, 2021

要在禁用 root 帳戶的機器上啟動 root shell,您可以執行以下之一:

  • sudo -i: 執行一個互動式登錄 shell(讀取/root/.bashrc/root/.profile
  • sudo -s: 執行一個非登錄的互動式 shell (reads /root/.bashrc)

在 Ubuntu 世界中,我經常看到sudo su建議作為獲取 root shell 的一種方式。當一個可以執行時,為什麼要執行兩個單獨的命令?據我所知,sudo -i等價於sudo su -sudo -s相同sudo su

唯一的區別似乎是(比較sudo -i左側和sudo su -右側):

融合比較“sudo -i”和“sudo su -”的螢幕截圖

並比較sudo -s(左)和sudo su(右):

融合比較“sudo -s”和“sudo su”的螢幕截圖

主要區別(忽略SUDO_foo變數和LS_COLORS)似乎是版本XDG_foo中的系統變數sudo su

是否存在這種差異需要使用相當不雅的情況sudo su?我可以安全地告訴人們(就像我經常說的那樣)跑步沒有任何意義,sudo su或者我錯過了什麼嗎?

正如您在問題中所述,主要區別在於環境。

sudo su -對比sudo -i

如果sudo su -它是一個登錄 shell,那麼/etc/profile,.profile.bashrc被執行,你會發現自己在 root 的主目錄和 root 的環境中。

sudo -i與 (simulate initial login) 選項幾乎相同,sudo su --i目標使用者的密碼數據庫條目指定的 shell 作為登錄 shell 執行。這意味著特定於登錄的資源文件,例如.profile.bashrc.login將由 shell 讀取和執行。

sudo su對比sudo -s

sudo su``sudo用命令呼叫su。Bash 被稱為互動式非登錄 shell。所以bash只能執行.bashrc。可以看到切換到root後你還在同一個目錄下:

user@host:~$ sudo su
root@host:/home/user#

sudo -s讀取$SHELL變數並執行內容。如果$SHELL包含/bin/bash它呼叫sudo /bin/bash,這意味著它/bin/bash作為非登錄 shell 啟動,因此所有點文件都不會被執行,但bash它本身會讀取 . bashrc主叫使用者。您的環境保持不變。你的家不會是根的家。所以你是root,但是在呼叫使用者的環境中。

結論

-i標誌是sudo2004年添加的,以提供與 類似的功能sudo su -,因此sudo su -它的模板也是如此,sudo -i並且旨在像它一樣工作。我認為你使用哪個並不重要,除非環境不重要。

添加

這裡必須提到的一個基本點是,它sudo被設計為只執行一個具有更高權限的命令,然後將這些權限降低到原始權限。它從來沒有打算真正切換使用者並打開一個root shell。隨著時間的推移,sudo這種機制得到了擴展,因為人們對為什麼要sudo在每個命令前面使用感到惱火。

所以 的意思sudo被濫用了。sudo旨在鼓勵使用者盡量減少 root 權限的使用。

我們現在擁有的是sudo變得越來越流行。它集成在幾乎所有知名的 linux 發行版中。切換到另一個使用者帳戶的原始工具是su. 對於一個老派 *nix 的老手來說,這樣的事情sudo似乎是不必要的。它增加了複雜性並且表現得更像我們從微軟作業系統系列中知道的機制,因此與 *nix 系統的簡單性理念相反。

我不是一個真正的老手,但在我看來,我一直是我的眼中釘,從被介紹的那一刻起,如果可能的話sudo,我總是在使用. sudo我最捨不得用sudo。在我所有的系統上,都啟用了 root 帳戶。但是事情會發生變化,也許時間會到來,什麼時候su會被棄用並完全sudo取代su

因此我認為,最好使用sudo’s 內部機制(-s, -i)而不是依賴於su.

引用自:https://unix.stackexchange.com/questions/218169