sudo su
,sudo su -
,sudo -i
和sudo /bin/bash
用于打开根会话,但是我不清楚它们之间的区别以及何时或是否存在区别。有人可以帮我解决这个问题吗?
#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 楼
要查找差异,您可以在不同的调用之间找到结果环境。您可以在一些关键变量中找到一些“小的”差异:
PATH
,LD_LIBRARY_PATH
,LD_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
评论
您忘记询问sudo -s和sudo su。相关:“ su”,“ sudo -s”,“ sudo -i”之间的区别
相关:“ sudo命令”和“ sudo sh命令”之间有什么区别?
相关:sudo su和sudo -i之间的功能区别是什么?
@RaduRădeanu当我输入问题时,我查看了建议的问题,但这些问题都没有真正解决我的完整问题。您链接到的问题也是如此。尽管它们确实为我提供了许多新信息,并且感谢您链接到它们,但我发现它们不如下面的用户混乱所提供的那样完整,这与我一直在寻找的内容更加一致。 >