debian su - 和 su $PATH 差异?

debian su - 和 su $PATH 差异?
$ 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-linux2018 年 7 月 27 日发布的版本 2.32-0.2)Debian 切换到了不同的su实现,请参阅错误 833256。 “新”su来自util-linux,而“旧”则包含在login包装中,源自src:shadow

引用自util-linux/NEWS.Debian.gz:

这两种实现非常相似,但有一些细微的差异(当然可能还有更多尚未注意到的差异),例如

  • 新的“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/binENV_PATHENV_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 脚本)

相关内容