ユーザーは自分のログインシェルをどのように起動しますか?

ユーザーは自分のログインシェルをどのように起動しますか?

Dockerイメージの基本コマンドでコンテナユーザーのログインシェルを起動したいと思います。

それは次のとおりです。


USER someuser
CMD /bin/zsh --login

上記のコードはログインシェルを取得しますが、作業ディレクトリをhomeに変更せず、homeエントリsomeuserもサポートしません。目的の結果(正しいシェル、作業ディレクトリをユーザーのホームディレクトリに)を取得できますが、それを正しく設定して親プロセスを停止するかどうかによって異なります。必ずしも必要でない限り、まったく頼りたくありません。someuser/etc/passwdsudo --user someuser --loginsomeuser/etc/sudoerssudosudo

/usr/bin/login -p -f someuserコマンドで試しましたがうまくいかないようです(エラーが何であるかわからない)。

次のことを試すことができますCMD sh -c 'cd "${HOME}" ; SHELL="${SHELL}" exec -a "-${SHELL##*/}" "${SHELL}"'異なるが関連する背景の議論)。これは機能しているように見えますが、設定によって異なり、参照されるシェルは、SHELL0番目の引数が.で始まる場合はログインシェルで始まる必要があると推測されます-。寛容な表現ですか?SHELL常に設定するか、ユーザーシェルプレフィックスを付けるのが常に機能しているかわかりません-。 (CMD sh -c '… exec -l "${SHELL}"'たとえば、0番目のパラメータがに設定されているため、これは完全に正確ではありません-/usr/bin/zsh。)

これ提案した内容が望む効果を出すようですが、agetty目標を達成する方法が一致しないようです。私も自分を台無しにしたくないgrep/awkいたずら/etc/passwd(しかしgetent passwd "$( id -u )" | cut -d : -f 7これらの方法のうち、最もあまり迷惑ではないようです。)

ユーザーがログインするときにパスワードなしでシェルまたはホームディレクトリの名前を明示的に指定する必要がないように、ユーザーが自分のログインシェルを起動する方法はありますか?

それよりも寛容なものが必要ですexec python -c 'import os, pwd, re ; ent = pwd.getpwuid(os.getuid()) ; os.chdir(ent.pw_dir) ; os.execv(ent.pw_shell, (re.sub(r"^.*/", "-", ent.pw_shell),))'


1このイメージは、事前にインストールされた特定のアプリケーションセットを実験するためにサンドボックス対話型環境を含む名前付き永続コンテナを作成するように設計されています。 (これはコンテナ化されたWebアプリケーションではありません。最小限の必要な構成で、Windowsホストで高度にカスタマイズされたLinux専用の数学/科学アプリケーションセットを実行すると想像してください。)上級ユーザーはsomeuserログインシェルを介してコンテナ内を変更できますchsh。デフォルトのコマンドは次のとおりです。これを尊重してください。

答え1

sudoユーザーがパスワードを要求しないか、そのシェルが何であるかを明示的に知らせずに自分のログインシェルを起動できるようにするコマンド(除外)はありません。 ~によるとこれ、ユーザーSHELL変数はいつもログインシェルに設定します。私のテストでは、これは完全に真実ではありませんでした。

% # SHELL is set if you're coming from bash ...
% docker run --rm debian:latest bash -c 'set -eux ; echo "${0}" ; echo "${SHELL}"'
bash
/bin/bash
+ echo bash
+ echo /bin/bash
# ... but not from sh? (Yikes!)
% docker run --rm debian:latest sh -c 'set -eux ; echo "${0}" ; echo "${SHELL}"'
+ echo sh
sh: 1: SHELL: parameter not set
sh
% # And USER is only set for interactive shells, maybe?
% docker run --rm debian:latest bash -c 'set -eux ; echo "${USER}"'
bash: line 1: USER: unbound variable

したがって、私が見逃したことがない場合は、(残念ながら)ユーザーがパスワードなしで自分のログインシェルを起動できる最も信頼できる方法です。

#!/usr/bin/env sh
set -ux

# USER isn't always set.
USER="${USER:-$( id -u )}"

# SHELL isn't always set. How fragile is that field number?
SHELL="${SHELL:-$( getent passwd "${USER}" | cut -d : -f 7 )}"

if [ -z "${SHELL}" ] ; then
  echo 1>&2 "${0}: can't set SHELL; giving up"
  exit 1
fi

# Dunno about HOME, but why relinquish our skepticism now?
HOME="${HOME:-$( getent passwd "${USER}" | cut -d : -f 6 )}"

if [ -z "${HOME}" ] ; then
  echo 1>&2 "${0}: can't set HOME; giving up"
  exit 1
fi

cd "${HOME}"

# This assumes that a shell knows it should be a login shell if its exec'ed argument
# begins with a "-".
SHELL="${SHELL}" exec -a "-${SHELL##*/}" "${SHELL}"

それは…たくさん。もっと良い方法がありました...

関連情報