Unyablog.

のにれんのブログ

devcontainer で ZSH のプロンプトが root 用になってしまう対策

自分は ZSH のプロンプトを以下のように設定して、 現在 root user かどうかを判別できるようにしている。

PROMPT='${prompt_header}
%~ %(!. !root! #.>) '

! は Shell が権限を持ってる時に true になり、その時は ! root ! # が、そうでない時は > を出すようになる。

zsh.sourceforge.io

ここで devcontainer で ZSH を立ち上げたとき、vscode user なのにプロンプトが ! root ! # になっていた。

理由としては ZSH のプロセスに SYS_PTRACE が設定されていたことだった。

ZSH の "privileged" の判定は UID が 0 だけではなく、何かしらの cap が設定されている場合も含まれるらしい。

The definition of ‘privileged’, for these purposes, is that either the effective user ID is zero, or, if POSIX.1e capabilities are supported, that at least one capability is raised in either the Effective or Inheritable capability vectors.

zsh: 13 Prompt Expansion

Devcontainer によっては SYS_PTRACE が追加されて立ち上がることもあるのだと思う。実際 podman run の引数には --cap-add SYS_PTRACE がされていた。

この prompt は root の時にミスオペをしないために設定しているものであって、cap があるかどうかを確かめたいものではないので、EUID が 0 かどうかのみで判定するように書き換えた。