要在禁用 root 帐户的计算机上启动 root shell,您可以运行以下命令之一:
sudo -i
:运行交互式登录 shell(读取/root/.bashrc
和/root/.profile
)sudo -s
:运行非登录交互式 shell(读取/root/.bashrc
)
在 Ubuntu 世界中,我经常看到sudo su
建议作为获取 root shell 的方法。既然一个命令就可以,为什么还要运行两个单独的命令呢?据我所知,sudo -i
相当于 且sudo su -
与sudo -s
相同sudo su
。
唯一的区别似乎是(比较sudo -i
左侧和sudo su -
右侧):
比较sudo -s
(左)和sudo su
(右):
主要区别(忽略SUDO_foo
变量 和LS_COLORS
)似乎是版本XDG_foo
中的系统变量sudo su
。
是否存在这种差异需要使用相当不优雅的情况sudo su
?我可以安全地告诉人们(就像我经常做的那样)跑步没有任何意义sudo su
,还是我错过了什么?
答案1
正如您在问题中所说,主要区别在于环境。
sudo su -
与sudo -i
如果sudo su -
它是登录 shell,则执行/etc/profile
、和 ,您将发现自己位于 root 的主目录中,并且具有 root 的环境。.profile
.bashrc
sudo -i
sudo su -
与(模拟初始登录)选项几乎相同,-i
将目标用户的密码数据库条目指定的 shell 作为登录 shell 运行。这意味着特定于登录的资源文件(例如.profile
、.bashrc
或 ).login
将由 shell 读取并执行。
sudo su
与sudo -s
sudo su
sudo
用命令调用su
。 Bash 被称为交互式非登录 shell。所以bash
只执行.bashrc
.可以看到切换到root后仍然在同一个目录中:
user@host:~$ sudo su
root@host:/home/user#
sudo -s
读取$SHELL
变量并执行内容。如果$SHELL
包含/bin/bash
它会调用sudo /bin/bash
,这意味着它/bin/bash
作为非登录 shell 启动,因此所有点文件都不会执行,但bash
它本身会读取 。bashrc
呼叫用户的。您的环境保持不变。你的家不会是 root 的家。所以你是 root,但是处于调用用户的环境中。
结论
该-i
标志已添加sudo
到2004年,提供与 类似的功能sudo su -
,sudo su -
模板也是如此sudo -i
,并且意味着像它一样工作。我认为使用哪个并不重要,除非环境不重要。
添加
这里必须提到的一个基本点是它sudo
被设计为仅运行一个命令具有更高的权限,然后将这些权限降低到原始权限。它从来都不是为了真正转变用户并保持打开 root shell。随着时间的推移,这种机制得到了扩展,因为人们对为什么要在每个命令前面sudo
使用感到恼火。sudo
所以这个词的意思sudo
就被滥用了。sudo
旨在鼓励用户尽量减少使用 root 权限。
我们现在所拥有的,正sudo
变得越来越流行。它几乎集成在每个知名的 Linux 发行版中。切换到另一个用户帐户的原始工具是su
。对于一个老派的 *nix 老手来说,这样的事情sudo
似乎没有必要。它增加了复杂性,并且行为更类似于我们从 Microsoft 操作系统系列中了解到的机制,因此与 *nix 系统的简单性理念背道而驰。
我并不是真正的老手,但在我看来,sudo
从引入它起,它一直是我的眼中钉,sudo
如果可能的话,我总是围绕 的用法进行工作。我最不愿意用sudo
。在我的所有系统上,root 帐户均已启用。但事情会发生变化,也许有一天su
会被弃用并被完全sudo
取代。su
因此我认为,最好使用sudo
内部机制(-s
,-i
)而不是依赖于旧工具,例如su
.
答案2
直接回答你的问题:不,没有充分的理由这样做。另外,当一个日志条目就足够时,sudo su 会生成两个日志条目。
我见过很多人这样做,当我问他们为什么不直接运行时sudo -s
,答案是他们不知道-s
sudo 的标志,通常他们会在我指出后切换。
但是,在您的sudo -s
和列表中sudo -i
,我想再添加一个选项 ,sudo -sE
它是 的替代品su -m
。 sudo -sE
保留您的环境,包括主目录。如果您的主目录不安全(在 NFS 上),这会存在风险。但在很多人使用 root 的环境中,它使您不必就 root 文件的内容达成一致.bashrc
。我的.bashrc
包含许多 root 的专业化,所以我没有得到与 root 完全相同的环境,但至少我得到了我想要的环境。