'sudo su -' vs 'sudo -i' vs 'sudo /bin/bash' - 什么时候使用哪个重要,还是根本不重要?

Pau*_*aul 308 command-line bash sudo su

当我做一些需要连续输入几十次 root 的事情时,我更喜欢将我的会话切换到 root 会话。在各种教程和说明我已经使用了互联网上,我看到了sudo susudo su -sudo -isudo /bin/bash用来打开一个root会话,但我不会在这些当之间,或者说差异事项的区别清楚。

有人可以帮我解决这个问题吗?

cha*_*aos 414

要解释这一点,您需要知道程序的作用:

  • su-该命令su被用来切换到另一用户(小号女巫Ú SER),但也可以通过调用无参数的命令切换到根用户。su在输入您切换到用户环境的密码后,要求您输入要切换的用户的密码。
  • sudo-sudo意味着使用 root 权限运行单个命令。但与su它不同的是它会提示您输入当前用户的密码。此用户必须在 sudoers 文件中(或在 sudoers 文件中的组)。默认情况下,Ubuntu 会“记住”您的密码 15 分钟,这样您就不必每次都输入密码。
  • bash- 与计算机交互的文本界面。了解登录、非登录、交互式和非交互式 shell 之间的区别很重要:

贝壳种类:

  • login shell:登录 shell 将您以指定用户身份登录到系统,这是必要的用户名和密码。当您点击ctrl+ alt+F1登录到虚拟终端时,您会在成功登录后获得一个登录 shell。
  • 非登录 shell:无需登录即可执行的 shell,为此必须是当前登录的用户。当您在 gnome 中打开图形终端时,它是一个非登录 shell。
  • 交互式 shell:一个 shell(登录或非登录),您可以在其中交互式键入或中断命令。例如一个 gnome 终端。
  • 非交互式 shell:可能从自动化进程运行的(子)shell。您将既看不到输入也看不到输出。

所以案例是:

  • sudo susudo使用命令调用su。Bash 被称为交互式非登录 shell。所以 bash 只执行.bashrc. 可以看到切换到root后你还在同一个目录下:

    user@host:~$ sudo su
    root@host:/home/user#
    
    Run Code Online (Sandbox Code Playgroud)
  • sudo su -这一次,它是一个登录shell,所以/etc/profile.profile.bashrc被执行,你会发现自己在根目录的主目录的根环境。

  • sudo -i它几乎与sudo su --i(模拟初始登录)选项运行目标用户的密码数据库条目指定的 shell 作为登录 shell。这意味着特定于登录名的资源文件,例如.profile,.bashrc.login将由 shell 读取和执行。

  • sudo /bin/bash这意味着您sudo使用命令调用/bin/bash/bin/bash以非登录 shell 启动,因此不会执行所有点文件,但 bash 本身会读取.bashrc调用用户。您的环境保持不变。你的家不会是root的家。所以你是 root,但在调用用户的环境中。

  • sudo -s读取$SHELL变量并执行内容。如果$SHELL包含/bin/bash它调用sudo /bin/bash(见上文)。

查看:

要检查您是否在登录 shell 中(仅在 bash 中有效,因为它shopt是一个内置命令):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Run Code Online (Sandbox Code Playgroud)

  • 只是澄清一下:`sudo` 允许允许的用户以超级用户 ** 或其他用户** 的身份执行命令。无论如何,为您的努力+1。 (21认同)
  • 此外,更“正确”的说法是 su 代表切换用户,而不是超级用户。即运行一个 php 脚本: su www-data /usr/share/script.php 或者只是 su www-data 用于交互式 shell。但是没有任何用户名的 su 将采用 root(超级用户)帐户。 (3认同)
  • @chaos 感谢您的出色回答!它主要回答了我的问题,所以我继续并标记了已回答的问题,但我不明白何时需要运行特定的 shell。我真的只通过命令行使用 Ubuntu,我发现打开 `root` 用户会话(与使用 `sudo` 相比)最常见的用途是当我做一些需要大量使用 `root` 权限的事情时,例如在安装新东西或执行重大重新配置时。我一直在使用`sudo /bin/bash`,但显然由于某种我不明白的原因,这种方法的名声很差。 (2认同)
  • @Paul:建议使用`sudo -i`。在这里阅读:http://ubuntuforums.org/showthread.php?t=1817402 和这里:http://unix.stackexchange.com/questions/98531/difference-between-sudo-i-and-sudo-su (2认同)

小智 7

要查找差异,您可以检查不同调用之间的结果环境。

您可能会在一些关键变量中发现一些“小”差异:

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

或者 ~/. 点文件处理 ( ~/.config)。

~/.xsession.errors还要考虑命令生成的基于 $HOME 的日志文件(等)或 xauth cookies( )的所有权~/.Xauthority

尝试这些命令:


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)


Run Code Online (Sandbox Code Playgroud)