如何确定环境变量来自哪里?

如何确定环境变量来自哪里?

我有一个前段时间设置的 Linux 实例。当我启动并登录时,root我设置了一些环境变量,但我不记得或找不到它们来自哪里。

  • 我已经检查了~/.bash_profile/etc/.bash_rc和所有启动脚本。
  • 我跑了findgrep无济于事。

我觉得我一定忘记看某个明显的地方了。有什么技巧可以解决这个问题吗?

答案1

如果zsh是您的登录 shell:

zsh -xl

bash

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

这将模拟登录 shell 并显示已完成的所有操作(除了使用 重定向 stderr 的区域zsh)以及当前正在解释的文件名。

因此,您需要做的就是在该输出中查找环境变量的名称。 (您可以使用该script命令来帮助您存储整个 shell 会话输出,或者对于该bash方法,使用7> file.log而不是将输出7>&2存储到终端而不是终端上)。xtracefile.log

如果您的变量不在那里,那么 shell 可能会在启动时继承它,因此它之前已在 PAM 配置中设置,~/.ssh/environment或者在 X11 会话启动时读取的内容(~/.xinitrc~/.xsession)或在启动登录的服务定义上设置管理器甚至更早的一些启动脚本。那么find /etc -type f -exec grep -Fw THE_VAR {} +可能会有所帮助。

答案2

首先要看的一些地方:

全系统范围

  • /etc/environment:专门用于环境变量
  • /etc/env.d/*: 环境变量,分成多个文件
  • /etc/profile:所有类型的初始化脚本
  • /etc/profile.d/*:初始化脚本
  • /etc/bashrc, /etc/bash.bashrc: 用于函数和别名

用户特定

  • ~/.profile:用于所有 shell
  • ~/.pam_environment:Linux 可插入身份验证模块的一部分
  • ~/.bash_profile:登录(bash-)shell 的初始化
  • ~/.bashrc:所有交互式(bash-)shell 的初始化
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc:与非 bash shell 类似

答案3

如果您使用该env命令显示变量,它们应该大致按照创建的顺序显示。您可以使用此指南来确定它们是由系统在启动初期设置的,还是由稍后的 .profile 或其他配置文件设置的。根据我的经验,setexport命令将按字母顺序对变量进行排序,因此列表没有那么有用。

答案4

如果您输入set -xor .profile.bash_profile则所有后续 shell 命令将被记录到标准错误,您可以查看其中之一是否设置了这些变量。您也可以将其放在set -x顶部来追踪它。/etc/profile输出可能非常详细,因此您可能希望将其重定向到具有类似exec 2>/tmp/profile.log.

如果您的系统使用 PAM,请在或中查找pam_env加载请求。该模块从指定的文件加载环境变量,如果未指定文件,则从系统默认值加载环境变量(在Debian 和 Ubuntu 上)。 Linux 上另一个包含环境变量定义的文件是(查找以 开头的行)。/etc/pam.conf/etc/pam.d/*/etc/environment/etc/security/pam_env.conf/etc/login.defsENV_

相关内容