しばらく前に設定したLinuxインスタンスがあります。起動してログインするときにroot
いくつかの環境変数を設定しましたが、その変数がどこから来たのか覚えていないか、見つかりませんでした。
~/.bash_profile
と/etc/.bash_rc
すべての起動スクリプトを確認しました。- 私は無駄
find
に走ったgrep
。
きっとどこかを見るのを忘れてしまったようです。この問題を解決する方法はありますか?
答え1
zsh
ログインシェルの場合:
zsh -xl
そしてbash
:
PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2
これはログインシェルをエミュレートし、完了したすべての操作(リダイレクトされたstderrを使用する領域を除くzsh
)と現在解釈されているファイル名を表示します。
したがって、すべきことは、その出力で環境変数の名前を見つけることです。 (このscript
コマンドを使用すると、シェルセッション全体の出力を保存できます。またはこのbash
方法では、出力を端末の代わりに端末に保存する7> file.log
ために使用できます。)7>&2
xtrace
file.log
変数がないと、シェルは起動時にそれを継承する可能性があるため、以前に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
: すべてのシェルについて~/.pam_environment
: Linux プラグイン認証モジュールの一部~/.bash_profile
:ログイン(bash-)シェルの初期化~/.bashrc
: すべての対話型(bash-)シェルの初期化~/.cshrc
,~/.zshrc
,~/.tcshrc
:bashではなくシェルに似ています
答え3
このenv
コマンドを使用して変数を表示する場合は、変数をほぼ生成された順序で表示する必要があります。このガイドを使用して、ブートプロセスの最初にシステムによって設定されたこと、および後で.profileまたは他の設定ファイルによって設定されたことを確認できます。私の経験では、set
コマンドexport
は変数をアルファベット順に並べ替えるので、リストはあまり役に立ちません。
答え4
set -x
または を入力すると、.profile
以降.bash_profile
のすべてのシェルコマンドが標準エラーに書き込まれ、そのうちの1つがこれらの変数を設定していることを確認できます。set -x
上部に配置して追跡することもできます。/etc/profile
出力が非常に冗長である可能性があるのでexec 2>/tmp/profile.log
。
pam_env
システムがPAMを使用している場合、またはでロード要求を見つけます。このモジュールは、指定されたファイルから環境変数をロードするか、ファイルが指定されていない場合(DebianおよびUbuntuの場合)、システムのデフォルトから環境変数をロードします。環境変数定義を含むLinux上の別のファイルは(で始まる行を検索する)です。/etc/pam.conf
/etc/pam.d/*
/etc/environment
/etc/security/pam_env.conf
/etc/login.defs
ENV_