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等。提示符将从 $ 更改为 #,表明您具有 root 访问权限。

  • sudo -s 以 root 身份启动 shell,但不会更改您的工作目录。

  • sudo bashbash运行的命令在 哪里sudo。该命令 bash以超级用户身份运行。

  • 使用sudo可以记录某人所做的一切。
  • 使用sudo可以防止用户必须知道 root 密码。
  • 使用sudo我们可以限制允许运行的命令。

相关内容