SSH 로그인에 기본이 아닌 로그인 셸을 사용하는 방법

SSH 로그인에 기본이 아닌 로그인 셸을 사용하는 방법

현재 인증을 위해 LDAP를 사용하는 네트워크에서 작업하고 있습니다. zsh로그인 셸로 설정 한 후 아직 설치 ssh되지 않은 것으로 보이는 네트워크의 컴퓨터에서 원격으로 액세스하는 데 문제가 발생했습니다 zsh. 로그인이 실패하고 표시됩니다.

Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist

따라서 질문은 기본적으로 다음과 같습니다. LDAP에 구성된 것과 다른 로그인 셸을 사용하도록 원격 컴퓨터에 어떻게 지시합니까?

OpenSSH_6.0p1 Debian-4+deb7u2, OpenSSL 1.0.1e

답변1

일부 시스템에서 로그인 쉘이 실행되지 않으면 SSH 또는 대부분의 다른 방법을 통해 해당 시스템에 로그인할 수 없습니다. SSH 서버는 항상 로그인 셸을 실행합니다. 명령줄에서 명령을 전달하면 ssh명령 문자열 1을 인수로 사용하여 로그인 쉘이 실행됩니다. -c그렇지 않으면 로그인 쉘은 인수 없이 로그인 쉘로 실행됩니다.

로그인 셸을 우회할 수 있는 방법이 있다면 이는 보안 허점이 될 것입니다. 계정의 로그인 셸을 하나의 특정 작업만 수행하는 프로그램으로 설정하여 계정을 제한된 계정으로 구성할 수 있습니다.git-shellgit 저장소에 대한 액세스만 허용하거나rssh, 등.

이 컴퓨터에 로그인하려면 /bin/zsh존재하도록 준비하거나 로그인 쉘이 존재하도록 변경해야 합니다.

이와 같은 이기종 환경에서는 /bin/sh어디에나 존재하는 로그인 셸을 사용하는 것이 좋습니다. zsh를 대화형 쉘로 사용할 수 있도록 환경 변수를 (있는 경우) SHELL로 설정하십시오./bin/zsh

if [ -x /bin/zsh ]; then
  export SHELL=/bin/zsh
fi

이렇게 하면 하드 코딩을 피할 수 있습니다 zsh.

if SHELL=$(command -v zsh); then
  export SHELL
else
  unset SHELL
fi

텍스트 모드 로그인을 위해 zsh를 자동 실행 하려면 .profile. .zprofile존재하지 않으므로 권장하지 않습니다). 대화형 로그인인 경우에만 이 작업을 수행하고 .profile스크립트에 의해 실행되거나 GUI 모드 로그인 중에는 수행하지 마십시오.

if case $- in *i*) true;; *) false;; esac &&  # interactive shell
   [ -z "$ZSH_VERSION" ] &&                   # not running zsh yet
   type zsh >/dev/null 2>/dev/null; then      # zsh is present
  exec zsh
fi

1 SSH 클라이언트는 옵션이 아닌 인수를 중간 공백과 연결하고 결과 문자열을 연결을 통해 보냅니다. SSH 프로토콜은 명령을 문자열 목록이 아닌 문자열로 정의합니다.

답변2

다른 방법을 통해 액세스할 수 있는 경우 지정된 시스템에 쉘을 설치하거나 관리자에게 이 작업을 수행하도록 요청하거나 ldap의 쉘을 원격 시스템에 존재하는 쉘로 변경해야 합니다.

(열기) sshd는언제나사용자 쉘을 확인하면언제나실행을 위해 쉘이 전달하는 모든 것을 실행하십시오. 실행할 다른 셸을 전달하면 이를 실행하고 사용자 셸에 인수로 전달합니다. 예를 들어 사용자 셸은 "/bin/sh"이고 csh 셸을 인수로 전달하면 "/bin/ sh -c가 실행됩니다. /빈/csh'.

관련 정보