当我执行需要连续输入数十次 root 权限的操作时,我更喜欢将会话切换到 root 会话。在互联网上我使用过的各种教程和说明中,我看到sudo su
、sudo su -
和用于打开 root 会话,但我不清楚它们之间的区别以及何时或是否重要sudo -i
。sudo /bin/bash
有人能帮我解决这个问题吗?
答案1
为了解释这一点,你需要知道程序的作用:
su
- 该命令su
用于切换到另一个用户(s巫婆你ser),但您也可以通过不带参数调用该命令来切换到root用户。su
要求您输入要切换的用户的密码,输入密码后您就切换到了该用户的环境。sudo
-sudo
旨在以 root 权限运行单个命令。但与此不同,su
它会提示您输入当前用户的密码。此用户必须在 sudoers 文件中(或 sudoers 文件中的组)。默认情况下,Ubuntu 会“记住”您的密码 15 分钟,这样您就不必每次都输入密码。bash
- 与计算机交互的文本界面。了解登录、非登录、交互式和非交互式 shell 之间的区别很重要:
贝壳种类:
- 登录外壳:登录 shell 会让您以指定用户身份登录系统,登录需要用户名和密码。当您按++ctrl登录虚拟终端时,登录成功后您将获得登录 shell。altF1
- 非登录 shell:无需登录即可执行的 shell,需要当前登录的用户。当您在 gnome 中打开图形终端时,它就是非登录 shell。
- 交互式外壳:您可以在其中以交互方式键入或中断命令的 shell(登录或非登录)。例如 gnome 终端。
- 非交互式 shell:可能从自动化进程运行的 (子) shell。您将看不到输入或输出。
因此情况如下:
sudo su
sudo
使用命令 调用。Bashsu
被调用为交互式非登录 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 运行。这意味着登录特定的资源文件(例如或 ).profile
将被 shell 读取和执行。.bashrc
.login
sudo /bin/bash
这意味着您sudo
使用命令/bin/bash
./bin/bash
调用时会以非登录 shell 形式启动,因此不会执行所有点文件,但 bash 本身会读取.bashrc
调用用户。您的环境保持不变。您的主目录将不是 root 的主目录。因此您是 root,但处于调用用户的环境中。sudo -s
读取$SHELL
变量并执行内容。如果$SHELL
包含/bin/bash
则调用sudo /bin/bash
(见上文)。
查看:
检查您是否处于登录 shell 中(仅在 bash 中有效,因为shopt
它是内置命令):
shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
答案2
为了寻找差异,您可以检查不同调用之间的结果环境。
你可以找到一些“小的”一些关键变量的差异:
PATH
,,LD_LIBRARY_PATH
LD_PRELOAD
或者 ~/. 中存在一些差异点文件處理(~/.config
)。
还请考虑命令生成的基于 $HOME 的日志文件(~/.xsession.errors
等...)或 xauth cookies( )的所有权。~/.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)