사용자는 자신의 로그인 쉘을 어떻게 시작합니까?

사용자는 자신의 로그인 쉘을 어떻게 시작합니까?

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}"'.다르지만 관련된 배경의 토론). 이것은 작동하는 것처럼 보이지만 설정에 따라 다르며 SHELL참조된 쉘은 0번째 인수가 .로 시작되면 로그인 쉘로 시작되어야 한다고 추론합니다 -. 관용적인 표현인가요? 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 이 이미지는 사전 설치된 특정 애플리케이션 세트를 실험하기 위해 샌드박스 대화형 환경을 포함하는 명명된 영구 컨테이너를 생성하도록 설계되었습니다. (이것은 컨테이너화된 웹 애플리케이션이 아닙니다. 최소한의 필수 구성으로 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}"

그건…많은. 더 좋은 방법이 있었을 텐데...

관련 정보