'sudo su -' 与 'sudo -i' 与 'sudo /bin/bash' - 什么时候使用哪个重要,或者根本不重要吗?

'sudo su -' 与 'sudo -i' 与 'sudo /bin/bash' - 什么时候使用哪个重要,或者根本不重要吗?

当我执行需要连续输入数十次 root 权限的操作时,我更喜欢将会话切换到 root 会话。在互联网上我使用过的各种教程和说明中,我看到sudo susudo su -和用于打开 root 会话,但我不清楚它们之间的区别以及何时或是否重要sudo -isudo /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 susudo使用命令 调用。Bashsu被调用为交互式非登录 shell。因此 bash 只执行.bashrc。您可以看到,切换到 root 后您仍然在同一目录中:

    user@host:~$ sudo su
    root@host:/home/user#
    
  • sudo su -这次它是一个登录 shell,因此/etc/profile.profile.bashrc被执行,你会发现自己处于 root 的主目录中,并且具有 root 的环境。

  • sudo -isudo 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_PATHLD_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)


相关内容