当我执行需要连续多次键入root的操作时,我希望将会话切换为root会话。在我在Internet上使用过的各种教程和说明中,我看到sudo susudo su -sudo -isudo /bin/bash用于打开根会话,但是我不清楚它们之间的区别以及何时或是否存在区别。

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

评论

您忘记询问sudo -s和sudo su。

相关:“ su”,“ sudo -s”,“ sudo -i”之间的区别

相关:“ sudo命令”和“ sudo sh命令”之间有什么区别?

相关:sudo su和sudo -i之间的功能区别是什么?

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

#1 楼

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




su-命令su用于切换到另一个用户(例如)。但是您可以也可以通过不带参数的命令切换到root用户。输入您切换到用户环境的密码后,su要求您输入要切换的用户密码。

sudo-sudo用于以root权限运行单个命令。但是与su不同,它提示您输入当前用户的密码。该用户必须位于sudoers文件中(或sudoers文件中的组中)。默认情况下,Ubuntu会“记住”您的密码15分钟,这样您就不必每次都键入密码。

bash-与计算机交互的文本界面。了解登录,非登录,交互式和非交互式外壳之间的区别很重要:

外壳类型:




login shell :登录shell以指定用户的身份登录到系统,这是用户名和密码。当您按ctrl + alt + F1登录虚拟终端时,成功登录后便会获得一个登录shell。

非登录shell:无需登录即执行的shell,为此需要一个当前登录的用户。在gnome中打开图形终端时,它是非登录外壳。

交互式外壳:一种外壳(登录或非登录),您可以在其中交互地键入或中断命令。例如gnome终端。

非交互式shell:可能从自动化过程运行的(子)shell。您将看不到输入或输出。

因此,情况如下:




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

user@host:~$ sudo su
root@host:/home/user#


sudo su -这次是登录shell,因此执行/etc/profile.profile.bashrc,您将发现自己处于具有root环境的root用户的主目录中。
sudo -i它与sudo su -几乎相同,-i(模拟初始登录) option将目标用户的密码数据库条目指定的外壳作为登录外壳运行。这意味着外壳将读取并执行特定于登录的资源文件,例如.profile.bashrc.login
sudo /bin/bash这意味着您使用命令sudo调用/bin/bash/bin/bash作为非登录外壳程序启动,因此不会执行所有的点文件,但是bash本身会读取调用用户的.bashrc。您的环境保持不变。您的家将不是根的家。因此,您是root用户,但在调用用户的环境中。
sudo -s读取$SHELL变量并执行内容。如果$SHELL包含/bin/bash,它将调用sudo /bin/bash(请参见上文)。

检查:

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

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


评论


只是说明一下:sudo允许允许的用户以超级用户或另一个用户的身份执行命令。无论如何,请+1。

– RaduRădeanu
13年11月13日在10:38

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

– Paul
13年11月23日在22:22



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

–oblivian
2014-02-19 22:29



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

–oblivian
2014年2月19日在22:45

@Paul:建议使用sudo -i。在这里阅读:ubuntuforums.org/showthread.php?t=1817402,在这里:unix.stackexchange.com/questions/98531/…

–马可·苏拉(Marco Sulla)
2014年9月10日在8:21

#2 楼

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

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




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)


 


评论


有趣的答案。

–not2qubit
20年5月1日17:00