Docker 이미지의 기본 명령으로 컨테이너 사용자의 로그인 셸을 시작하고 싶습니다.
그것은 다음과 같습니다:
…
USER someuser
CMD /bin/zsh --login
위의 코드는 로그인 셸을 가져오지만 작업 디렉터리를 home으로 변경하지 않으며 home 항목 someuser
도 지원하지 않습니다 . 원하는 결과(올바른 쉘, 작업 디렉토리를 사용자의 홈 디렉토리로)를 얻을 수 있지만 이를 올바르게 구성 하고 상위 프로세스를 정지시키는지에 따라 달라집니다. 꼭 필요한 것이 아니라면 전혀 의존하고 싶지 않습니다.someuser
/etc/passwd
sudo --user someuser --login
someuser
/etc/sudoers
sudo
sudo
/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}"
그건…많은. 더 좋은 방법이 있었을 텐데...