sshリモート実行時の環境変数について
avashe.icon sshでリモートコマンド実行時に読まれてるものとそうでない変数、何が違うか気になったので sshdによって呼び出されるbashはnon-interactive non-login modeで動作する bashは呼びされ方によって読み込むセットアップスクリプトの種類を変える
login shell有効なら.bash_loginが、interactive mode有効なら.{.bash_}profileが追加で読み込まれる
ちなみに、non-interactiveだとプロンプト表示を意味する環境変数PS1が無効化されるので、この変数で分岐してinteractive時の設定を隠すという素朴目な仕組み。これを使っていなければ.bashrcが読まれる。
non-interactive non-loginでも例外あり
bashなら。shモードで呼び出し場合この例外はない
$BASH_ENVは探索して読み込まれる
sshdを介すと.bashrcが読み込まれる(どういう要望でこうなった?
Bash attempts to determine when it is being run with its standard input connected to a network connection, as when executed by the remote shell daemon, usually rshd, or the secure shell daemon sshd. If Bash determines it is being run in this fashion, it reads and executes commands from ~/.bashrc, if that file exists and is readable. It will not do this if invoked as sh.
このmodeは恐らくほかのシェルでも似た仕組みが採用されているはず
シェル自体の仕組みと別に、pamモジュールのpam_envにパスを読み込む仕組みがある /etc/security/pam_env.conf, /etc/environment を読み込む(~/.pam_environmentは非推奨)
特にグローバルな/etc/environmentが大事
シェル実行以前のユーザ認証段階でロードされる
ちなみにsshdが提供するセットアップスクリプトもある
ただし全ユーザの変数を読むようになるのでユーザの管理方法によってはセキュリティリスクになりうる
まぁ普段読み飛ばすところを体系的に理解できたということで
pamもう少し突っ込んで調べたい
ちょっとびっくりしたのは、systemdの機能でもユーザ環境変数を読めること
environment.d(5)が~/.config/environment.d/*.confを読む