sudo -i
和 和有什么区别sudo su
?
答案1
根据手册页的描述su
,我sudo
假设以下内容:
- 由于
sudo -iu <user>
表示登录 shell,这相当于su - <user>
orsu -l <user>
。 - 不
su
带任何参数的 会更改您的有效用户 ID,但您仍在使用原始<user>
环境,并且who 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(root)。
$ egrep "Uid|Gid" /proc/$(pgrep su -n)/task/$(pgrep su -n)/status
Uid: 500 0 0 0
Gid: 501 501 501 501
不过我的环境还是saml
这样的。这是环境变量之一,$LOGNAME
.
$ env | grep LOGNAME
LOGNAME=saml
通过 (su -) 或 (sudo -i) 成为 root
$ su -
使用su -
或sudo -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
root
嗯,一件重要的事情是,通过这种方法,我的有效 ID 和真实 ID 都是 0 ( ) 。环境变量$LOGNAME
就好像我们以root
.
$ env | grep LOGNAME
LOGNAME=root
比较环境
如果我们计算这 3 个方法中的行数,也许可以获得一些额外的信息。
$ env > /tmp/<method used to become root>
我们剩下这 3 个文件:
- -rw-r--r-- 1 root root 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 十一月 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
。那么让我们看看其他 2 个文件。
除了一些外观变量(例如$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
或成为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
、 和$MAIL
是$USERNAME
唯一的区别。
参考
答案2
我认为@slm误解了这个问题,所以提供另一个答案。
他确实说到了要点,一个是登录 shell,另一个不是。
运行时,sudo -i
shell 将成为登录 shell,因此它将读取诸如~/.profile
where 之类的内容,而非登录 shell 只会读取~/.bashrc
.
sudo
当与链接时su
(如sudo su
), 和 都不会sudo
调用su
登录 shell。与sudo -i
使用时等效su
的是sudo su -l
.
我个人认为sudo su
这与“猫的无用使用”的例子类似。您可以使用 获得相同的行为sudo -s
。
通过 sudo 调用 root shell 基本上有 5 种常见方法
sudo su
- 非登录 shell
- 设置
HOME
为/root
- 修剪环境
sudo -i
- 登录外壳
- 设置
HOME
为/root
- 修剪环境
sudo su -l
- 登录外壳
- 设置
HOME
为/root
- 修剪环境
当调用 shell 时,这相当于
sudo -i
sudo -s
- 非登录 shell
- 设置
HOME
为/root
- 修剪环境
当调用 shell 时,这相当于
sudo su
sudo -Es
- 非登录 shell
HOME
独自离开- 不影响环境(除了
$PATH
和$LD_LIBRARY_PATH
iirc)
请注意,这些规则仅在使用它们来获取 shell 时适用。sudo -s somecommand
和之间是有区别的sudo su -c somecommand
。
答案3
第二个命令保留当前目录 (pwd),但第一个命令将用户放置到根目录的主目录。