su 與 sudo -s 與 sudo -i 與 sudo bash

su 與 sudo -s 與 sudo -i 與 sudo bash

以下命令有什麼不同:

su
sudo -s
sudo -i
sudo bash

我知道su我需要知道 root 密碼,而且sudo我必須在sudoers文件中,但是一旦執行有什麼區別?

su我知道和之間有區別,sudo -s因為我的主目錄是/root在我執行之後su,但我的主目錄仍然是/home/myname在之後sudo -s。但我懷疑這只是我所忽略的潛在差異的一個症狀。

答案1

su變得另一個使用者 — 預設為 root,但也可能是另一個使用者。如果您說su -,您的環境也會被該使用者的登入環境所取代,因此您看到的內容與以該使用者身分登入的內容沒有什麼區別。系統無法su根據其他使用者登入時的操作來判斷您在向其他使用者執行的操作。

情況非常不同sudo

  • 您運行的命令sudo 執行作為目標使用者(預設為 root,但可以更改),-u但它會記錄您透過它運行的命令,並用您的使用者名稱標記它們,以便之後可以分配責任。 :)

  • sudo非常靈活。例如,您可以限制允許給定使用者或使用者群組運行的命令。有了su,要嘛全有,要嘛全無。

    此功能通常用於定義角色。例如,您可以定義一個允許運行dump和的「備份」群組tar,每個群組都需要 root 存取權才能正確備份系統磁碟。

    我在這裡提到這一點是因為這意味著你可以給予某人sudo特權而不給予他們sudo -ssudo bash能力。他們只擁有完成工作所需的權限,但su他們可以運行整個系統。不過,你必須小心這一點:sudo vi例如,如果你賦予某人說 的能力,他們就可以擺脫vi並擁有與 相同的權力sudo -s

  • 因為它使用 sudoer 的密碼而不是 root 密碼,所以sudo隔離了多個 sudoer 之間的權限。

    這解決了一個管理問題su,即當 root 密碼更改時,su必須告知所有必須知道該密碼才能使用的人。sudo允許 sudoers 的密碼獨立更改。事實上,對系統上的 root 使用者帳戶進行密碼鎖定以sudo強制所有系統管理任務通過sudo.在擁有許多受信任的 sudo 者的大型組織中,這意味著當其中一位系統管理員離開時,您不必更改 root 密碼並將其分發給留下的管理員。

sudo bash和之間的主要區別sudo -s是:

  1. -s短於bash

  2. 您可以說在預設 shell 下sudo -s some-command運行,但具有超級使用者權限。some-command它基本上是 的簡寫sudo $SHELL -c some-command

  3. 您可以將命令傳遞到 shell 的標準輸入,例如sudo -s < my-shell-script.你可以將它與特雷多克向單一sudo呼叫發送多個命令,從而避免sudo重複鍵入。

  4. 即使沒有這些額外的命令參數,sudo -s仍然不同,sudo bash因為它可能運行與 不同的 shell bash,因為它首先在SHELL環境變數中查找,然後如果未設置,則在用戶的登入 shell 設定中查找,通常在/etc/passwd.

執行的 shellsudo -s繼承您目前的使用者環境。如果您真正想要的是一個乾淨的環境,就像登入後獲得的那樣,那麼您想要的sudo -isudo.粗略地說,sudo -i就是 to sudo -sas su -is to su:它會重置除幾個關鍵環境變數之外的所有變量,並將您帶回使用者的主目錄。如果您沒有透過標準輸入或命令給它在該 shell 下運行的命令sudo -i some-command,它將將該 shell 作為互動式登入 shell 運行,以便您的使用者的 shell 啟動腳本(例如.bash_profile)再次運行。

所有這些sudo -i都比sudo -s.為什麼?因為如果有人可以之前修改您的環境sudo -s,他們可能會導致執行意外的命令。最明顯的情況是修改SHELL,但它也可能不太直接地發生,例如PAGER如果您說man foowhile under則通過sudo -s

您可能會說,“如果他們可以修改PAGER,他們就可以修改PATH,然後他們就可以替換一個邪惡的sudo程序”,但是足夠偏執的人可以說/usr/bin/sudo /bin/bash要避免這個陷阱。你可能沒有那麼偏執,以至於你也避免了所有的陷阱其他但是,容易受到環境變數的影響。EDITOR例如,您是否還記得在執行任何命令之前進行檢查VCS命令?因此sudo -i

因為sudo -i還將您的工作目錄更改為使用者的主目錄,所以您可能仍然希望sudo -s在您知道要保留在cd運行時進入的同一目錄中的情況下使用sudo。不過,sudo -i往返cd原處還是比較安全。

您有時會看到的所有這一切的另一個變體是sudo su,它大約相當於sudo -s。同樣,sudo su -在功能上也非常接近sudo -i。由於sudosu是競爭命令,因此將它們像這樣配對有點奇怪,因此我建議您改用標誌sudo

答案2

來自一個ubuntu 論壇貼文我不久前做了:

考慮以下實驗:

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

以下是我發現的差異:

sudo -s

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

sudo su

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

請注意 中的差異$HOME。成為 root 並$HOME設定為普通使用者的主目錄可能會導致問題。例如,如果您執行圖形應用程序,普通使用者的應用程式~/.Xauthority可能會被 root 覆蓋。這會導致以後出現正常使用者問題,例如無法透過 cron 執行某些圖形應用程式。

總結一下:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 可能由/etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

最重要的是,sudo -i當您想要一個不受使用者環境污染的 root shell 時,請執行正確的命令。

答案3

sus巫婆序列或s替代品ser) 讓您切換使用者。su基本上以目標使用者的權限啟動另一個 shell 實例。預設情況下,它會將​​您切換到root用戶,如果我們想切換特定用戶,我們需要傳遞用戶,如下所示:

$ su bob  # switches to bob (requires bob's password)

su -表示環境變數將重設為root,su表示環境變數為舊用戶。

例如:如果您使用 root 的主目錄,su -或者如果您使用 .old 使用者的主目錄su

須藤(s上層塞爾) 是一個命令列實用程序,允許用戶以另一個用戶的安全權限運行程序,預設是超級用戶,即root。它使用一個配置文件/etc/sudoers,其中列出了哪些用戶有權執行特定操作

sudo 應該讀作/ˈsuːduː/。文法sudo commands巫婆塞爾和這個命令。

  • su相當於sudo -i並模擬登入 root 帳號。您的工作目錄將為/root,它將讀取 root 的目錄.profile等。

  • sudo -s 以 root 身分啟動 shell,但不會變更您的工作目錄。

  • sudo bashbash運行的命令在 哪裡sudo。該命令 bash以超級用戶身份運行。

  • 使用sudo可以記錄某人所做的一切。
  • 使用sudo可以防止使用者必須知道 root 密碼。
  • 使用sudo我們可以限制允許運行的命令。

相關內容