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

为什么在这个例子中一个被偏爱而不是另一个?
sudo su
echo "options iwlwifi 11n_disable=1" >> /etc/modprobe.d/iwlwifi.conf
exit

请提供Ubuntu文档的链接。

1请重新考虑您对“被接受”的答案的选择。票数最低的那个实际上是唯一正确的答案。 - Kyle Strand
3个回答

sudo su 命令代表“切换用户”,允许您成为另一个用户。它允许授权用户以超级用户或其他用户的身份执行命令,如 sudoers 文件中指定的那样。 ‑i(模拟初始登录)选项将目标用户的密码数据库条目指定的 shell 作为登录 shell 运行。这意味着 shell 将读取特定于登录的资源文件,例如 .profile.login。如果指定了命令,则通过 shell 的 ‑c 选项将其传递给 shell 执行。如果未指定命令,则执行交互式 shell。 来源:ManPage

1使用 su 会导致安全问题,并且本质上是危险的。 - OrangeDog
这与使用 su 完全无关。 - OrangeDog
1如果你运行sudo su,会要求你输入密码,而不是root密码。root用户甚至不需要设置密码。无论如何,如果管理员使用root密码,并不意味着所有普通用户都知道它。 - OrangeDog
2不,不会。sudo 会以 root 权限运行 su 命令,而 root 可以在不知道用户密码的情况下切换到任何用户。对系统如何工作的基本误解应该被我认为贬低。 - OrangeDog
@OrangeDog 我有些困惑。我已经修改了答案以反映这一点。 - Mitch
3删除您的评论只会增加混乱。 - OrangeDog
我猜那是个错误。你能删除吗?:) - Mitch
1你并没有让情况变得更好。sudo -i也不会要求输入root密码,所以与问题无关。 - OrangeDog

sudo su只是将当前用户切换为root用户。环境设置(如PATH)保持不变。

sudo -i会创建一个全新的环境,就像root刚刚登录一样。

如果使用其他用户,这种差异更加明显。在执行sudo su bob后,你将成为bob,但仍停留在相同的位置。而在执行sudo -i -u bob后,你将成为bob,在bob的主目录中,使用bob的默认shell,并且已经运行了bob的.profile和任何其他登录脚本。

请参阅man sudo以获取有关-i的更多详细信息。不幸的是,man su对细节描述较少。


找到一个版本的man su(来自login-1:4.1.4.2+svn3283-3ubuntu5.1),它有以下内容:
引用: $PATH根据/etc/login.defs选项ENV_PATH或ENV_SUPATH进行重置(见下文); 如果设置了,$IFS将被重置为“”。 请注意,环境的默认行为如下: $HOME、$SHELL、$USER、$LOGNAME、$PATH和$IFS环境变量将被重置。 如果未使用--login,则会复制环境,但上述变量除外。 如果使用了--login,则会复制$TERM、$COLORTERM、$DISPLAY和$XAUTHORITY环境变量(如果已设置)。 其他环境可能由PAM模块设置。
因此,无论以何种程度上sudo su改变环境取决于您的发行版和设置。因此,理论上sudo -i更具可移植性。

su 可以更改环境设置,并可使用 --l 模拟登录。即使没有 -l$PATH 也会被更改。在发表之前,请先测试这些声明!(您是不是想说 PWD 保持不变?) - Kyle Strand
1真正的问题是,sudo su -sudo -i之间有什么区别? - Kyle Strand
sudo su不会运行.profile(因为它还没有登录)或者.bashrc(因为它还没有启动bash),也不会改变任何东西,那么它怎么会改变PATH呢? - OrangeDog
显然,它会更改用户和主目录(以及SUDO_COMMAND),我猜它可能是从/etc/passwd中提取的,但我没有看到(在测试期间也没有)PATH如何改变。 - OrangeDog
1你显然对此进行了一些思考,并在shell中进行了一些测试,所以对于我无礼的"测试这些说法"评论,我向你道歉。话虽如此,在我的系统上,当我使用su而不使用sudo(使用root密码)时,确实观察到了$PATH的变化。根据info su(也许是你回答中更好的链接),su确实读取了要切换到的用户的密码条目。可能我观察到的$PATH的变化是与系统有关的(我使用的是Debian 7)。 - Kyle Strand
根据那个,su 会改变 HOME、USER、LOGNAME 和 SHELL。sudo su 也会将 SUDO_COMMAND 和 USERNAME(变成 root)更改。如果要切换到的用户的 shell 与当前 shell 不同,它将启动该 shell,并运行其 rc 文件。 - OrangeDog
1嗯,我的“man su”(比你提供的那个更长)显示它是shadow-utils 4.1.5.1的一部分。我的“man”页面还说,即使使用了 --preserve-environment$PATH 也会被设置。所以我猜这只是不同版本的 su 之间的差异。 - Kyle Strand
1行为还受您的PAM配置的影响。/etc/pam.d/sudo/etc/pam.d/su可能被设置为完全不同或完全相同的操作。 - OrangeDog

主要问题是(不太)合理的环境设置。
使用sudo su,新的shell从发出命令的用户那里获取其环境-这可能会有问题。
使用sudo -i可以获得一个干净的root shell。
请参阅关于sudo和shell的特殊说明
需要注意的是,几乎没有必要创建一个root shell。

1你所链接的“特殊说明”中说sudo -i类似于sudo su -,但实际上它并不会从执行该命令的用户获取环境。 - Kyle Strand
@KyleStrand 感谢你指出这个问题 - 这是一个打字错误,实际上问题是关于 sudo susudo -i 的区别。 - guntbert
为什么在环境方面使用sudo su会有问题?能否详细解释一下这个想法? - Manuel Jordan
@ManuelJordan,请查看我链接页面上的“摘要”。 - guntbert
那个“summary”部分以哪些词语开头?如果你能告诉我具体的部分名称会更好。谢谢。 - Manuel Jordan
1@ManuelJordan 有一个名为“发现的差异总结”的表格。 - guntbert