我在我的计算机上创建了一个用户名,并将该用户名添加到 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 su
或sudo 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.