全局 profile 脚本
/etc/profile.d/ 下的脚本会在登录 shell 启动时被 /etc/profile 按文件名顺序逐个 source,所以这里的改动影响全部用户,影响面大于单个用户家目录里的文件。它既是发行版放环境变量与补全脚本的地方,也是全局持久化的常用落点。
基本信息
| 目录 | /etc/profile.d/,脚本通常以 .sh 结尾 |
|---|---|
| 触发方式 | /etc/profile 在登录 shell 启动时按文件名顺序加载 |
| 生效范围 | 所有用户的登录 shell,非交互 shell 未必加载 |
| 相关文件 | /etc/profile、/etc/bashrc、zsh 的 zprofile |
| 观察点 | mtime、脚本内容、可执行位与文件属主 |
| 权限要求 | 读取与修改都需要 root |
典型使用场景
- 排查影响全系统的持久化脚本
- 核对全局环境变量是否被改动
- 分析登录后命令行为异常的原因
- 与用户级启动文件对照确定生效范围
- 系统级持久化面的整体盘点
最小示例
最小示例
ls -lt --time-style=long-iso /etc/profile.d/ | head # 按时间排序看最近改动
grep -Rn 'curl\|wget\|base64\|/tmp/\|/dev/shm/' /etc/profile.d/ # 高风险特征
cat /etc/profile | grep -n 'profile.d' # 确认加载逻辑
stat -c '%n mtime=%y ctime=%z' /etc/profile.d/*.sh | head
lsattr -R /etc/profile.d/ 2>/dev/null | head # 是否存在不可变属性
find /etc/profile.d -maxdepth 1 -type f -printf '%M %u %p\n' | head观察项与信号
| 观察项 | 含义 | 异常信号 |
|---|---|---|
| 文件时间戳 | 最后一次改动时刻 | 与包升级时间或运维窗口不符 |
| 文件属主 | 正常由包管理安装 | 属主被改为普通账号 |
| 内容特征 | 环境变量与补全脚本 | 含下载、解码或重定向语句 |
| 命名顺序 | 按名称排序加载 | 前缀被改动以调整执行顺序 |
| 属性位 | 是否被加锁 | 基线之外出现不可变属性 |
只有登录 shell 会加载这些脚本,非交互 shell 通常不读它们;判断影响范围时要先分清 shell 类型。
文件名前缀决定加载顺序,调整前缀可以让脚本先于或后于其它脚本执行,排查时注意文件名是否被改过。
排查期间不要对这些脚本执行 source 或直接运行;阅读内容与计算哈希即可,避免重新触发持久化动作。