$ su -
Password:
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# exit
logout
$ su
Password:
# echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
$PATH
如果我执行简单的 su,我不知道为什么 /bin 和 /sbin 没有添加到。过去就是这种情况。我怎样才能解决这个问题?我确实注意到:
-rw-r--r-- 1 root root 0 Jan 8 2018 /etc/environment
但除此之外我的系统看起来很正常。
编辑:我忘记了强制性的uname -a
Linux rpi3 4.17.0-1-arm64 #1 SMP Debian 4.17.8-1 (2018-07-20) aarch64 GNU/Linux
编辑2:
$ cat /etc/issue
Debian GNU/Linux buster/sid \n \l
所有软件包都来自“测试”存储库,因为“稳定”软件包在 aarch64 上运行得不太好。
答案1
最近(util-linux
2018 年 7 月 27 日发布的版本 2.32-0.2)Debian 切换到了不同的su
实现,请参阅错误 833256。 “新”su
来自util-linux
,而“旧”则包含在login
包装中,源自src:shadow
这两种实现非常相似,但有一些细微的差异(当然可能还有更多尚未注意到的差异),例如
- 新的“su”(没有参数,即在保留环境时)还保留 PATH 和 IFS,而旧的 su 即使在“保留环境”模式下也始终会重置 PATH 和 IFS。
- su ''(空用户字符串)过去用于提供 root,但现在返回错误。
- 以前 su 只有一个 pam 配置,但现在 'su -' 在 /etc/pam.d/su-l 中单独配置
第一个差异可能是用户最明显的差异。由于多种原因,执行简单的“su”确实是一个坏主意,因此强烈建议使用“su -”以始终获得类似于正常登录的新设置环境。如果您想恢复与前一个更相似的行为,您可以在 /etc/login.defs 中添加“ALWAYS_SET_PATH yes”。
之前使用的su
实现对于PATH
.此错误报告中也对此进行了讨论,请参阅833256#80。新的su
保留PATH
如果不是调用与su -
.
简而言之:Debian 的旧版本su
表现得像su -
,至少在PATH
.对于新的实现,您几乎应该始终使用su -
,与其他发行版类似。
答案2
Debiansu
联机帮助页告诉:
当前环境将传递到新 shell。对于普通用户或 超级用户,的值
$PATH
将重置为。这可能会随着中的和定义而改变。/bin:/usr/bin
/sbin:/bin:/usr/sbin:/usr/bin
ENV_PATH
ENV_SUPATH
/etc/login.defs
引用自/etc/login.defs
:
# Three items must be defined: MAIL_DIR, ENV_SUPATH, and ENV_PATH. # If unspecified, some arbitrary (and possibly incorrect) value will # be assumed. All other items are optional - if not specified then
在普通的 Debian 系统上,变量定义在/etc/login.defs
:
#
# *REQUIRED* The default PATH settings, for superuser and normal users.
#
# (they are minimal, add the rest in the shell startup files)
ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
通过注释掉的测试ENV_SUPATH
会部分重现您的问题:su
不会/sbin
(也不会/usr/local/bin
)同时su -
执行登录脚本/etc/profile
,该脚本将PATH
按照 root 用户的预期重新定义。
因此,您应该检查是否有任何更改/etc/login.defs
并进行更正,或者查看其他部分是否更改了PATH
后者(例如 shell 启动脚本,例如某些非登录 bashrc 脚本)