Joe*_*oel 219 shell bash environment-variables
我有一个前段时间设置的 Linux 实例。当我启动并登录时,因为root我设置了一些环境变量,但我不记得或找不到它们来自哪里。
~/.bash_profile、/etc/.bash_rc和所有启动脚本。find也grep没有用。我觉得我一定是忘了看某个明显的地方。有什么技巧可以解决这个问题吗?
Sté*_*las 201
如果zsh是您的登录外壳:
zsh -xl
Run Code Online (Sandbox Code Playgroud)
与bash:
PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2
Run Code Online (Sandbox Code Playgroud)
这将模拟登录 shell 并显示已完成的所有内容(除了使用 重定向 stderr 的区域zsh)以及当前正在解释的文件的名称。
因此,您需要做的就是在该输出中查找环境变量的名称。(您可以使用该script命令来帮助您存储整个 shell 会话输出,或者对于该bash方法,使用7> file.log代替7>&2将xtrace输出存储到file.log而不是在终端上)。
如果你的变量不在那里,那么 shell 可能在启动时继承了它,所以它是在 PAM 配置中设置的,在~/.ssh/environment, 或者在你的 X11 会话启动时读取的内容 ( ~/.xinitrc, ~/.xsession) 或在启动登录的服务定义时设置manager 甚至更早的一些引导脚本。那么 afind /etc -type f -exec grep -F THE_VAR {} +可能会有所帮助。
小智 90
一些先看的地方:
系统范围
/etc/environment: 专门用于环境变量/etc/env.d/*: 环境变量,拆分成多个文件/etc/profile: 所有类型的初始化脚本/etc/profile.d/*: 初始化脚本/etc/bashrc, /etc/bash.bashrc: 用于函数和别名用户特定
~/.bash_profile:登录(bash-)shell 的初始化~/.bashrc:所有交互式(bash-)shell 的初始化~/.profile: 用于所有外壳~/.cshrc, ~/.zshrc, ~/.tcshrc: 与非 bash shell 类似小智 77
如果您使用该env命令来显示变量,它们应该大致按照它们的创建顺序显示。您可以使用它作为指导,以确定它们是在引导的早期由系统设置的,还是由稍后的 .profile 或其他配置文件设置的。根据我的经验,set和export命令将按字母顺序对其变量进行排序,因此列表没有那么有用。
Aar*_*nce 43
@Cian 是正确的。除了使用findand 之外grep,没有什么可以做来发现它的来源。知道它确实是一个环境变量,我会尝试将您的搜索集中在 /etc/ 和您的主目录中。替换VARIABLE为您正在搜索的适当变量:
$ grep -r VARIABLE /etc/*
$ grep -r VARIABLE ~/.*
Gil*_*il' 26
如果您set -x输入.profile或.bash_profile,所有后续的 shell 命令都将被记录到标准错误中,您可以查看其中一个是否设置了这些变量。您也可以将其放在set -x顶部以/etc/profile进行跟踪。输出可能非常冗长,因此您可能希望将其重定向到类似exec 2>/tmp/profile.log.
如果您的系统使用 PAM,pam_env请在/etc/pam.conf或 中查找加载请求/etc/pam.d/*。此模块从指定的文件加载环境变量,如果未指定文件(/etc/environment以及/etc/security/pam_env.conf在 Debian 和 Ubuntu 上),则从系统默认加载环境变量。Linux 上另一个带有环境变量定义的文件是/etc/login.defs(查找以 开头的行ENV_)。
小智 5
对于zsh用户来说,跟踪(在启动期间)访问的文件可能很有用,它们不会太多,可以逐一查看它们的定义位置。
zsh -o SOURCE_TRACE
Run Code Online (Sandbox Code Playgroud)