以下命令有什麼不同:
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 -s
或sudo 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
是:
-s
短於bash
您可以說在預設 shell 下
sudo -s some-command
運行,但具有超級使用者權限。some-command
它基本上是 的簡寫sudo $SHELL -c some-command
。您可以將命令傳遞到 shell 的標準輸入,例如
sudo -s < my-shell-script
.你可以將它與特雷多克向單一sudo
呼叫發送多個命令,從而避免sudo
重複鍵入。即使沒有這些額外的命令參數,
sudo -s
仍然不同,sudo bash
因為它可能運行與 不同的 shellbash
,因為它首先在SHELL
環境變數中查找,然後如果未設置,則在用戶的登入 shell 設定中查找,通常在/etc/passwd
.
執行的 shellsudo -s
繼承您目前的使用者環境。如果您真正想要的是一個乾淨的環境,就像登入後獲得的那樣,那麼您想要的sudo -i
是sudo
.粗略地說,sudo -i
就是 to sudo -s
as su -
is to su
:它會重置除幾個關鍵環境變數之外的所有變量,並將您帶回使用者的主目錄。如果您沒有透過標準輸入或命令給它在該 shell 下運行的命令sudo -i some-command
,它將將該 shell 作為互動式登入 shell 運行,以便您的使用者的 shell 啟動腳本(例如.bash_profile
)再次運行。
所有這些sudo -i
都比sudo -s
.為什麼?因為如果有人可以之前修改您的環境sudo -s
,他們可能會導致執行意外的命令。最明顯的情況是修改SHELL
,但它也可能不太直接地發生,例如PAGER
如果您說man foo
while 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
。由於sudo
和su
是競爭命令,因此將它們像這樣配對有點奇怪,因此我建議您改用標誌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
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
可能由/etc/environment
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
最重要的是,sudo -i
當您想要一個不受使用者環境污染的 root shell 時,請執行正確的命令。
答案3
su
(s巫婆你序列或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 command
即s巫婆你塞爾和做這個命令。
su
相當於sudo -i
並模擬登入 root 帳號。您的工作目錄將為/root
,它將讀取 root 的目錄.profile
等。sudo -s
以 root 身分啟動 shell,但不會變更您的工作目錄。sudo bash
bash
運行的命令在 哪裡sudo
。該命令bash
以超級用戶身份運行。- 使用
sudo
可以記錄某人所做的一切。 - 使用
sudo
可以防止使用者必須知道 root 密碼。 - 使用
sudo
我們可以限制允許運行的命令。