问题描述
当我正在做一些需要根连续输入数十次的内容时,我更喜欢将会话切换到根会话。在我在互联网上使用的各种教程和说明中,我看到sudo su,sudo su – ,sudo -i和sudo /bin /bash被用来打开根会话,但我不清楚它们之间的区别以及何时或如果差异很重要。
有人可以帮我解决这个问题吗?
最佳解决办法
为了解释这一点,你需要知道程序的功能:
su
– 命令su
用于切换到另一个用户(用户),但也可以通过不带参数调用该命令来切换到root用户。在输入切换到用户环境的密码后,su
会询问您要切换的用户密码。
sudo
– sudo
旨在以root权限运行单个命令。但与su
不同,它会提示您输入当前用户的密码。此用户必须位于sudoers文件(或sudoers文件中的组)中。默认情况下,Ubuntu “remembers”你的密码为15分钟,这样你就不必每次输入你的密码。
bash
– 与计算机交互的text-interface。了解登录,non-login,交互式和non-interactive shell 之间的区别很重要:
-
登录shell:登录shell以特定用户的身份登录系统,这是用户名和密码所必需的。当您点击
ctrl
+alt
+F1
登录到虚拟终端后,您将成功登录登录shell。 -
non-login shell 程序:在没有登录的情况下执行的 shell 程序,目前是logged-in用户。当你在gnome中打开一个图形终端时,它是一个non-login shell 。
-
交互式shell:一个shell(登录或non-login),您可以在其中交互式输入或中断命令。例如一个gnome终端。
-
non-interactive shell:可能从自动进程运行的(子)shell。您将看不到输入或输出。
sudo su
使用命令su
调用sudo
。 Bash被称为交互式non-login shell 。所以bash只执行.bashrc
。你可以看到,切换到root后,你仍然在同一个目录中:
user@host:~$ sudo su
root@host:/home/user#
sudo su -
这一次它是一个登录shell,因此/etc/profile
,.profile
和.bashrc
被执行,您将会发现自己位于root的主目录下,并且拥有root的环境。
sudo -i
与sudo su -
几乎相同-i(模拟初始登录)选项将目标用户的密码数据库条目指定的shell作为登录shell运行。这意味着login-specific资源文件(如.profile
,.bashrc
或.login
)将被shell读取和执行。
sudo /bin/bash
这意味着您使用命令/bin/bash
调用sudo
。 /bin/bash
作为non-login shell 启动,因此所有dot-files都不执行,但bash本身读取主叫用户的.bashrc
。你的环境保持不变。你的家不会是根的家。所以你是根,但是在主叫用户的环境中。
sudo -s
读取$SHELL
变量并执行内容。如果$SHELL
包含/bin/bash
,则调用sudo /bin/bash
(请参见上文)。
检查:检查您是否在登录shell中(仅在bash中工作,因为shopt
是内置命令):
shopt -q login_shell && echo 'Login shell' || echo 'No login shell'