![在任何 shell 或 sudo、pam.d 更改之前,在 linux 中设置的用户 PATH 在哪里?](https://linux22.com/image/91739/%E5%9C%A8%E4%BB%BB%E4%BD%95%20shell%20%E6%88%96%20sudo%E3%80%81pam.d%20%E6%9B%B4%E6%94%B9%E4%B9%8B%E5%89%8D%EF%BC%8C%E5%9C%A8%20linux%20%E4%B8%AD%E8%AE%BE%E7%BD%AE%E7%9A%84%E7%94%A8%E6%88%B7%20PATH%20%E5%9C%A8%E5%93%AA%E9%87%8C%EF%BC%9F.png)
我注意到,在 Raspbian 中,如果我在不使用 shell 的情况下通过 ssh 运行命令,我会得到以下信息$PATH
;
$ ssh pi@raspberrypi env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
我找不到这条路径的实际设置位置。
我假设/etc/profile
或都没有/etc/bashrc
来源,因为它不是登录,也不是交互式 shell。看起来它可能会访问bashrc
,但不会走得太远;
# cat /etc/bash.bashrc
# System-wide .bashrc file for interactive bash(1) shells.
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
帕姆
然而,看起来会话将通过 pam 进行处理,并且/etc/pam.d/sshd
建议使用/etc/environment
、/etc/security/pam_env.conf
和/etc/default/locale
来设置环境变量;
# Read environment variables from /etc/environment and
# /etc/security/pam_env.conf.
session required pam_env.so # [1]
# In Debian 4.0 (etch), locale-related environment variables were moved to
# /etc/default/locale, so read that as well.
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
但是,在这台计算机上,这些文件都不包含任何对设置路径的引用。例如
# cat /etc/default/locale
# File generated by update-locale
LANG=en_GB.UTF-8
# cat /etc/environment
root@raspberrypi:~#
# cat /etc/security/pam_env.conf | grep "^[^#;]"
root@raspberrypi:~#
登录名.defs
我唯一能找到类似于的路径集的地方
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
位于 /etc/login.defs 文件中;
login.defs:ENV_PATH PATH=/usr/local/sbin:/usr/local/bin: \
/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
看起来后一条路径的元素顺序正确,但组件sbin
被删除。然而,文档login.defs
建议该文件是大部分已弃用;
过去由影子密码套件提供的大部分功能现在由 PAM 处理。因此,passwd(1) 不再使用 /etc/login.defs,login(1) 和 su(1) 也较少使用 /etc/login.defs。请参阅相应的 PAM 配置文件。
/home/pi/.bashrc
pi 用户是使用一些骨架文件创建的,但对于非交互式、非登录 shell 来说,似乎没有一个文件会被读取;
# cat /home/pi/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
/home/pi/.profile
# cat /home/pi/.profile
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
原始的 $PATH 是否硬编码到某个二进制文件中,或者我遗漏了什么?
答案1
它被硬编码在sshd
二进制文件中。
$ strings /usr/sbin/sshd |grep /usr/local/bin
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
在 OpenSSH 可移植代码中,这是_PATH_STDPATH
/usr/bin:/bin:/usr/sbin:/sbin
对于 root 和非 root 来说默认都是这样。这Debian 构建规则/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
对于 root 用户,请将此设置为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Ubuntu 上的非 root 用户,/usr/local/bin:/usr/bin:/bin
在安装实时媒体 (udeb) 上,/usr/local/bin:/usr/bin:/bin:/usr/games
否则为非 root 用户。