sudo -i 和 sudo su 之间的区别

sudo -i 和 sudo su 之间的区别

sudo -i和 和有什么区别sudo su

答案1

根据手册页的描述su,我sudo假设以下内容:

  1. 由于sudo -iu <user>表示登录 shell,这相当于su - <user>or su -l <user>
  2. 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.

例子

我有一个用户帐户,samlUID 为 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 显示到不同的位置。

外卖?

  1. 最大的收获是,用于成为 root 的方法sudo -i比其他方法有优势,因为您可以使用自己的密码来执行此操作,从而防止需要泄露 root 的密码。
  2. 当你成为时,就会有日志记录root,而神秘地有人root通过su或成为su -
  3. sudo -i为您提供比这两者更好的用户体验,su因为它可以保护您的$DISPLAY$TERM.
  4. sudo -iroot当用户成为 时,通过限制给定的环境为系统提供一些保护。

怎么样sudo su——你们甚至没有讨论过吗?

尽管OP询问了这一点,但我还是故意避免将其纳入讨论,因为这样做只会使问题变得混乱,IMO。当您运行sudo susudo命令时,会掩盖该命令的影响,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 -ishell 将成为登录 shell,因此它将读取诸如~/.profilewhere 之类的内容,而非登录 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_PATHiirc)

请注意,这些规则仅在使用它们来获取 shell 时适用。sudo -s somecommand和之间是有区别的sudo su -c somecommand

答案3

第二个命令保留当前目录 (pwd),但第一个命令将用户放置到根目录的主目录。

相关内容