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


254

当我执行需要连续多次键入root的操作时,我希望将会话切换为root会话。在各种教程和说明我已经使用了互联网上,我看到了sudo susudo su -sudo -isudo /bin/bash用来打开一个root会话,但我不会在这些当之间,或者说差异事项的区别清楚。

有人可以帮我清理一下吗?


11
你忘了问sudo -ssudo su
RaduRădeanu13年




3
@RaduRădeanu当我输入问题时,我查看了建议的问题,但这些问题都没有真正解决我的完整问题。您链接到的问题也是如此。尽管它们确实为我提供了许多新信息,并且感谢您链接到它们,但我发现它们不如下面的用户混乱所提供的那样完整,这与我一直在寻找的内容相符。
保罗

Answers:


325

要对此进行解释,您需要知道程序的作用:

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

外壳类型:

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

因此,情况是:

  • sudo susudo用命令调用su。Bash被称为交互式非登录外壳。因此,bash仅执行.bashrc。您可以看到切换到root之后,您仍然在同一目录中:

    user@host:~$ sudo su
    root@host:/home/user#
  • 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作为非登录外壳程序启动,因此不会执行所有的点文件,但bash本身会读取.bashrc调用用户。您的环境保持不变。您的家将不是根的家。因此,您是root用户,但在调用用户的环境中。

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

校验:

要检查您是否在登录shell中(由于shopt是内置命令,因此只能在bash 中使用):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'

18
只是澄清一下:sudo允许允许的用户以超级用户或另一个用户的身份执行命令。无论如何,请+1。
RaduRădeanu13年

2
@chaos感谢您的出色回答!它主要回答了我的问题,所以我继续将问题标记为已回答,但是我不了解何时需要运行特定的shell。我真的只通过命令行使用Ubuntu,而我发现打开root用户会话(相对于using sudo)的最常见用法是在执行需要大量使用root特权的操作时,例如在安装新内容或执行重大重新配置时。我一直在使用sudo /bin/bash,但是由于某种我不了解的原因,显然该方法的说唱效果不好。
保罗

2
同样,说su代表切换用户而不是超级用户更“正确”。即运行一个php脚本:su www-data /usr/share/script.php或只是su www-data用于交互式shell。但是不带任何用户名的su将假定为超级用户帐户。
oblivian 2014年

混乱-“ shopt -q login_shell && echo'Login shell'|| echo'No login shell'”我经常看到这些建议,但是为什么要花这么长时间呢?&&运算符表示如果退出代码为0,则“执行下一个命令”,双管道(||)表示其他(如果不为0),则执行此命令。因此,基本上说的是,如果退出代码0然后回显“登录外壳”,如果退出代码1(失败)然后回显“不登录”。为什么不只是“ shopt -q login_shell; echo $?” $?表示前一个命令的结果/退出代码。在大多数(如果不是全部)程序中,0表示成功,1或更多表示失败。因此,如果回声为0 =成功...
oblivian


0

为了寻找差异,您可以在不同的调用之间调整结果环境。

您可以在一些关键变量中找到一些“小”差异:

  • PATHLD_LIBRARY_PATHLD_PRELOAD

或〜/中的一些差异。点文件处理(~/.config)。

还请考虑命令生成的基于$ HOME的日志文件(~/.xsession.errors,等等...)或xauth cookie(~/.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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.