LS_COLORS 在 sudo su 后如何保留

LS_COLORS 在 sudo su 后如何保留

我在我的计算机上创建了一个用户名,并将该用户名添加到 sudoers 文件中以获得 root 访问权限。

我的.bashrc文件还包含一个脚本,该脚本表示要更改 PS1 的颜色和 ls 命令的颜色

export PS1="\[\e[1;32m\][\u@\h \W]\$\[\e[0m\] "
export LS_COLORS="di=1:fi=0:ln=31:pi=5:so=5:bd=5:cd=5:or=31:mi=0:ex=35:*.rpm=90"

在脚本结束时,我还可以使用命令sudo su在登录时直接获取 root 权限。

问题是 PS1 持续存在并且颜色随后发生变化,sudo su但 ls 命令仍然是默认命令。我怎样才能解决这个问题?

答案1

以普通用户身份运行sudo -l以查看当前有效的选项。

  • 输出包括env_reset?如果是这样,则在浏览时只会保留一小部分安全/必要的环境变量sudo。您可以在文件中使用env_check和/或env_keep关键字sudoers来指定允许通过sudo.

  • 输出包括always_set_home?如果是这样,那么$HOME环境变量将指向目标用户的主目录,即/root您的情况。因此,生成的 shell 将运行,而不是您个人的 shell,同样,所有程序都将在目录而不是您的个人主目录/root/.bashrc下查找其用户特定的配置文件。/root/

如果sudo -s使用 root.bashrc而不是您个人的,那么always_set_home很可能会生效(或者您有一个带有严格的 PAM 模块或其他东西的奇怪发行版)。在这种情况下,请使用visudo编辑 sudoers 文件,并添加以下行之一(选项名称前的感叹号表示“不”):

  • Defaults !always_set_home取消所有用户的选项设置。
  • Defaults>root !always_set_home为所有到 root 用户的转换取消设置它,无论原始用户是谁。
  • Defaults:johndoe !always_set_home取消设置它以进行转换,其中johndoe仅包含原始用户。

Defaults顺序很重要:最后一个设置获胜,因此如果文件中存在任何现有行sudoers,您应该在它们之后添加自定义设置。


如果您su在 后链接sudo,它将应用自己的规则,这些规则通常是不可配置的。不同 Linux 发行版和版本之间的行为(甚至可用性)su -p有所不同。su -m

sudo su意味着从普通用户切换到 root 用户,然后再次从 root 用户切换到 root 用户,从而最大限度地增加破坏精心调整的个人环境设置的机会,但收效甚微。您sudo -s可以直接或通过文件Defaults中的一些选项调整来实现相同的目标,sudoers具体取决于您的偏好和 Linux 发行版的选择。

sudo su -,另一方面,是过时的就是说“我明确希望环境就像目标用户(即 root)直接登录一样;我不希望在生成的会话中保留我的个人环境的痕迹。”如果您有一个sudo在本世纪发布的版本,您可以使用sudo -i它来实现这一目标。

在 2010 年代,使用sudo susudo su -可能是肌肉记忆、遵循过时的建议或处理真正旧的系统。您可能应该忘记这两个命令。

答案2

sudo su -p将保留调用用户的环境,但有一些例外。例外情况可以在su手册页,但相关部分是:

   -m, -p, --preserve-environment
          Preserve the entire environment, i.e. it does not set HOME,
          SHELL, USER nor LOGNAME.  This option is ignored if the option
          --login is specified.

相关内容