sudo -i 和 sudo su 之間的區別
sudo -i
和 和有什麼不一樣sudo su
?
根據手冊頁的描述
su
,sudo
我會假設以下內容。
- 由於
sudo -iu <user>
意味著登錄外殼,這將等效於su - <user>
orsu -l <user>
。- 不
su
帶任何參數的 a 會更改您的有效使用者 ID,但您仍在使用原始<user>
環境,並且 awho am i
將報告您仍然是<user>
.摘錄 sudo 手冊頁
-i [command] The -i (simulate initial login) option runs the shell specified in the passwd(5) entry of the target user as a login shell. This means that login-specific resource files such as .profile or .login will be read by the shell. If a command is specified, it is passed to the shell for execution. Otherwise, an interactive shell is executed. sudo attempts to change to that user's home directory before running the shell. It also initializes the environment, leaving DISPLAY and TERM unchanged, setting HOME, MAIL, SHELL, USER, LOGNAME, and PATH, as well as the contents of /etc/environment on Linux and AIX systems. All other environment variables are removed.
例子
我有一個使用者帳戶,
saml
UID 為 500。$ egrep "Uid|Gid" /proc/$$/task/$$/status Uid: 500 500 500 500 Gid: 501 501 501 501
在上面的輸出中,第一列是我的真實 UID (uid),第二列是我的有效 UID (euid)。
通過 (su) 成為 root
$ su
現在我是 root,但我仍然維護我的環境,我的真實 UID 仍然是
500
. 請注意,我的 euid 現在是 0(根)。$ egrep "Uid|Gid" /proc/$(pgrep su -n)/task/$(pgrep su -n)/status Uid: 500 0 0 0 Gid: 501 501 501 501
但是我的環境仍然是
saml
‘s。這是他的環境變數之一,$LOGNAME
.$ env | grep LOGNAME LOGNAME=saml
通過 (su -) 或 (sudo -i) 成為 root
$ su -
使用
su -
orsudo -i
不僅可以將我的有效 UID 更改為新使用者,而且我還可以像登錄一樣獲取他們的文件,並且我的環境現在變得相同,就好像我是他們直接登錄一樣。$ egrep "Uid|Gid" /proc/$(pgrep su -n)/task/$(pgrep su -n)/status Uid: 500 0 0 0 Gid: 501 501 501 501
但是我的環境是現在
root
的。相同的變數,$LOGNAME
,現在設置為root
。$ env | grep LOGNAME LOGNAME=root
那麼有什麼區別呢?
好吧,讓我們試試上面的方法
sudo -i
並找出答案。$ sudo -i
現在讓我們看一下相同的資訊:
$ egrep "Uid|Gid" /proc/$(pgrep su -n)/task/$(pgrep su -n)/status Uid: 0 0 0 0 Gid: 501 501 501 501
一個主要的事情是我的有效 ID 和真實 ID 都是 0 (
root
) 使用這種方法。環境變數$LOGNAME
就像我們以root
.$ env | grep LOGNAME LOGNAME=root
比較環境
如果我們計算 3 種方法中的行數,也許還有一些額外的資訊。
$ env > /tmp/<method used to become root>
我們剩下這3個文件:
- -rw-r–r– 1 根根 1999 年 11 月 2 日 06:43 sudo_root.txt
- -rw-r–r– 1 根 1970 年 11 月 2 日 06:44 sudash_root.txt
- -rw-r–r– 1 root root 4859 Nov 2 06:44 su_root.txt
我們已經可以看到,只有一個簡單的
su
. 環境。是其他人的 2 倍以上。每個中的行數:
$ wc -l su* 28 sudash_root.txt 32 sudo_root.txt 92 su_root.txt
真的沒有必要進一步查看
su_root.txt
文件。該文件包含執行該su
命令的大部分使用者環境。那麼讓我們看看另外兩個文件。除了一些外觀變數(例如
$LANG
略有不同)之外,它們幾乎相同。列表中的一個確鑿證據是$PATH
.須藤
PATH=/usr/lib64/ccache:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/brlcad/bin:/root/bin
他的 -
PATH=/usr/lib64/qt-3.3/bin:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/brlcad/bin:/root/bin
正如您所看到
sudo -i
的,通過去除可疑路徑為我們提供了一些額外的保護,但它也可以保持我們的$DISPLAY
完整性$TERM
,以防我們將 GUI 顯示到不同的位置。帶走?
- 所以最大的收穫是,用於成為 root 的方法
sudo -i
比其他方法更有優勢,因為您使用自己的密碼來這樣做,保護 root 的密碼不被洩露。- 當你成為時有日誌記錄
root
,而神秘地有人root
通過su
or成為su -
。sudo -i
為您提供比任何一個更好的使用者體驗,su
因為它可以保護您的$DISPLAY
和$TERM
.sudo -i``root
通過限制使用者所處的環境,在使用者成為時為系統提供一些保護。怎麼樣
sudo su
,你都沒討論過?我故意避免將其帶入討論,即使 OP 詢問了它,因為這樣做只會混淆這個問題,IMO。當您執行
sudo su
該sudo
命令時su
,您從正常su
中獲得的大部分環境的影響都會失去。Sudo 正在做它的工作並提供一個有限且受保護的環境,無論它是sudo su
還是sudo -i
.例子
這是
sudo su
環境被轉儲的結果:ls -l /tmp/sudosu_root.txt -rw-r--r-- 1 root root 1933 Nov 2 14:48 /tmp/sudosu_root.txt
和行數:
$ wc -l /tmp/sudosu_root.txt 31 /tmp/sudosu_root.txt
sudo su -
這些是 a和 a之間唯一不同的變數sudo -i
:$ sdiff /tmp/sudosu_root.txt /tmp/sudo_root.txt | grep ' |' USERNAME=saml | USERNAME=root PATH=/usr/lib64/ccache:/sbin:/bin:/usr/sbin:/usr/bin:/usr/brl | PATH=/usr/lib64/ccache:/usr/local/sbin:/sbin:/bin:/usr/sbin:/ MAIL=/var/spool/mail/saml | MAIL=/var/spool/mail/root PWD=/home/saml/tst | PWD=/root SUDO_COMMAND=/bin/su | SUDO_COMMAND=/bin/bash XAUTHORITY=/root/.xauthYFtlL3 | XAUTHORITY=/var/run/gdm/auth-for-saml-iZePuv/datab
因此,正如您所看到的,它們之間確實沒有太大區別。略有不同
$PATH
,$SUDO_COMMAND
和$USERNAME
是唯一的區別。參考