Closed7
SSHログインした時に.zshenvが読み込まれない!?
結論
環境について
- 開発環境として使うDockerコンテナにSSH接続したい.OSはGentoo.(100%個人的な好みによる選定)
- dotfilesはchezmoiで管理.
$PATH
おかしくないですか
あの,なんかSSHでコンテナに接続しようとしたらstarship
が見当たらねえぞって怒られた.
> ssh nxvzbgbfben@localhost -p 2222 -i ~/.ssh/dev-env
The authenticity of host '[localhost]:2222 ([::1]:2222)' can't be established.
ED25519 key fingerprint is SHA256:3FciZADyl5QDzoxeMFFcIlyYvyFoksx0Js4qwf3J3ZY.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
/home/nxvzbgbfben/.local/etc/zsh/.zshrc:53: command not found: starship
dev-env-gentoo%
.zshenv
ではshell共通の設定を別の場所から読み込むようにしている.
.zshenv
source $HOME/.local/etc/nxvzbgbfben/shell/set_environment_variables.sh
export ZDOTDIR=$XDG_CONFIG_HOME/zsh
set_environment_variables.sh
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_CONFIG_HOME="$HOME/.local/etc"
export XDG_STATE_HOME="$HOME/.local/var/lib"
export XDG_CACHE_HOME="$HOME/.local/var/cache"
export BIN_HOME="$HOME/.local/bin" # starshipはここにいる
export OPT_HOME="$HOME/.local/opt"
export CARGO_HOME="$OPT_HOME/cargo"
export PNPM_HOME="$XDG_DATA_HOME/pnpm"
export RUSTUP_HOME="$OPT_HOME/rustup"
export WASMTIME_HOME="$OPT_HOME/wasmtime"
export BIN_HOME="$CARGO_HOME/bin:$WASMTIME_HOME/bin:$BIN_HOME"
export PATH="$PNPM_HOME:$BIN_HOME:$PATH"
docker exec
で入った場合はちゃんとstarship
が読み込まれている...
> docker compose exec --user nxvzbgbfben gentoo zsh
~
⬢ [Docker] > whereis starship
starship: /home/nxvzbgbfben/.local/bin/starship
ログインシェルとインタラクティブシェル
zshの設定ファイルの読み込み順序は下の記事が詳しい.
少なくとも.zshenv
は絶対に読み込まれるはず.
docker exec
を実行した場合はインタラクティブシェルとして,ssh
を実行した場合はログインシェルとして起動しているようなので,それぞれの場合において起動時に何が読み込まれているのかを調べてみる.
SOURCE_TRACE
とりあえずdocker exec
を実行してコンテナに入り,その中でzshを起動してみる.
インタラクティブシェルとして起動
> docker compose exec --user nxvzbgbfben gentoo zsh
~
⬢ [Docker] > zsh -o SOURCE_TRACE
+/home/nxvzbgbfben/.local/etc/zsh/.zshenv:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/nxvzbgbfben/shell/set_environment_variables.sh:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/zsh/.zshrc:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/zsh/.zcompdump:1> <sourcetrace>
ログインシェルとして起動
> docker compose exec --user nxvzbgbfben gentoo zsh
~
⬢ [Docker] > zsh --login -o SOURCE_TRACE
+/home/nxvzbgbfben/.local/etc/zsh/.zshenv:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/nxvzbgbfben/shell/set_environment_variables.sh:1> <sourcetrace>
+/etc/zsh/zprofile:1> <sourcetrace>
+/etc/profile.env:1> <sourcetrace>
+/etc/profile.d/gawk.sh:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/zsh/.zshrc:1> <sourcetrace>
/home/nxvzbgbfben/.local/etc/zsh/.zshrc:53: command not found: starship
+/home/nxvzbgbfben/.local/etc/zsh/.zcompdump:1> <sourcetrace>
ふむ,どちらの場合も.zshenv
は読み込まれている...
つまり,.zshenv
が読み込まれてから.zshrc
が読み込まれるまでの間に$PATH
が上書きされているのか.
/etc/profile.env
って誰
なんとなく怪しいのは/etc/profile.env
だな.
/etc/profile.env
はenv-update
がGentooのシステムで定義された環境変数を結合して格納する場所のようだ.
中身を見てみよう.
/etc/profile.env
# THIS FILE IS AUTOMATICALLY GENERATED BY env-update.
# DO NOT EDIT THIS FILE. CHANGES TO STARTUP PROFILES
# GO INTO /etc/profile NOT /etc/profile.env
export CONFIG_PROTECT='/usr/share/gnupg/qualified.txt'
export CONFIG_PROTECT_MASK='/etc/sandbox.d /etc/gentoo-release /etc/ca-certificates.conf /etc/revdep-rebuild'
export GCC_SPECS=''
export INFOPATH='/usr/share/gcc-data/x86_64-pc-linux-gnu/13/info:/usr/share/binutils-data/x86_64-pc-linux-gnu/2.42/info:/usr/share/autoconf-2.71/info:/usr/share/automake-1.16.5/info:/usr/share/info'
export LANG='en_US.UTF-8'
export LESS='-R -M --shift 5'
export LESSOPEN='|lesspipe %s'
export LEX='flex'
export MANPAGER='manpager'
export MANPATH='/usr/share/gcc-data/x86_64-pc-linux-gnu/13/man:/usr/share/binutils-data/x86_64-pc-linux-gnu/2.42/man:/usr/local/share/man:/usr/share/man:/usr/lib/rust/man'
export PATH='/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/bin'
export ROOTPATH='/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/bin'
ああ,$PATH
がここで上書きされている...
とりあえず解決
それじゃあ/etc/profile.env
以降で読まれるはずの.zprofile
で環境変数の宣言をすればいいのか.
.zprofile
source $HOME/.local/etc/nxvzbgbfben/shell/set_environment_variables.sh
ちゃんと読み込まれるのか調べてみる.
> docker compose exec --user nxvzbgbfben gentoo zsh
~
⬢ [Docker] > zsh --login -o SOURCE_TRACE
+/home/nxvzbgbfben/.local/etc/zsh/.zshenv:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/nxvzbgbfben/shell/set_environment_variables.sh:1> <sourcetrace>
+/etc/zsh/zprofile:1> <sourcetrace>
+/etc/profile.env:1> <sourcetrace>
+/etc/profile.d/gawk.sh:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/zsh/.zprofile:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/nxvzbgbfben/shell/set_environment_variables.sh:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/zsh/.zshrc:1> <sourcetrace>
+/home/nxvzbgbfben/.local/opt/fzf/shell/completion.zsh:1> <sourcetrace>
+/home/nxvzbgbfben/.local/opt/fzf/shell/key-bindings.zsh:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/zsh/.zcompdump:1> <sourcetrace>
お,これなら大丈夫そうだ.
SSHで再度接続してみる.
> ssh nxvzbgbfben@localhost -p 2222 -i ~/.ssh/dev-env
nxvzbgbfben in [SSH] dev-env-gentoo in ~
⬢ [Docker] >
お,直った.
だいぶ雑な直し方だけど,とりあえず解決した.
おわり
このスクラップは3ヶ月前にクローズされました