ZSH를 기본 셸로 사용하여 시스템에 SSH로 연결하면 /etc/profile이 실행되지 않습니다.

ZSH를 기본 셸로 사용하여 시스템에 SSH로 연결하면 /etc/profile이 실행되지 않습니다.

일부 ATM 기계에서 이상한 동작이 발생합니다. 적어도 나와 내 동료에게는 이상해 보였고 아무런 설명도 찾지 못했습니다. :)

[편집 1]
다음 단락이 잘못된 것 같습니다. 마지막 편집 2를 참조하세요.
여기서는 bash와 zsh를 사용합니다. 따라서 ssh login@hostzsh를 기본 쉘로 사용하도록 구성된 일부 zsh-default-machines(plain) 에 SSH를 통해 연결할 때 chsh -s /usr/bin/zsh이후에 열리는 쉘은 대화형이지만 대화형입니다.로그인하지 않았습니다해당 컴퓨터에 이미 로그인되어 있는지 여부에 관계없이 쉘.

내 이해에 따르면 SSH를 통해 컴퓨터에 연결하면 해당 컴퓨터에서 새로운 사용자 세션이 시작되어야 하므로 필요한 셸은 로그인 셸입니다. zsh도 이와 같아야 하지 않나요?

컴퓨터의 기본 쉘을 bash로 변경하는 경우 로그인 쉘을 사용하여 컴퓨터에 로그인하십시오.

이것이 zsh의 정상적인 동작입니까? 변경될 수 있나요? 아니면 일부 구성 오류입니까?
[/편집1]

[편집 2] 좋습니다. ZSH 문서에 따르면 로그인 셸인지 쉽게 테스트할 수 있습니다.

$ if [[ -o login ]]; then; print yes; else; print no; fi

바라보다:http://zsh.sourceforge.net/Guide/zshguide02.html

그러나 zsh man 항목/문서로 인해 zsh는 소스를 사용하여 /etc/profile스크립트를 가져와야 합니다 /etc/profile.d/*.sh. 위의 문제는 스크립트가 다음과 같다는 사실에서 비롯됩니다.아니요소스이므로 대부분의 환경 변수 및 시스템 구성 항목이 올바르게 초기화되지 않았습니다. 그러나 위에서 언급한 것처럼 bash를 기본 셸로 사용하고 /etc/profileprofile.d 폴더의 스크립트가 소스로 사용되는 경우입니다.
[/편집2]

[편집 3 - 답변] 아래 댓글에 답변을 주신 @StéphaneChazelas에게 감사드립니다! 소싱은 zsh/compatibility 모드에서 실행될 때만 발생하는 것 같습니다 /etc/profile(해당 man 항목 참조).shkshhttps://linux.die.net/man/1/zsh). SSH를 통해 로그인하면 이 호환 모드가 실행되지 않으므로 반드시 자체적으로 획득할 zsh필요는 없지만 [/edit 3]을 통해 실행 해야 합니다./etc/profile.zprofile

시스템: 운영 체제: Ubuntu 18.04 zsh-5.4.2, omz 및 일부 플러그인이 활성화되었습니다.

감사합니다!

답변1

이것이 ZSH의 작동 방식입니다./etc/profileZSH용 초기화 파일이 아닙니다.. ZSH는 /etc/zprofile~/.zprofile.

ZSH 초기화 파일:

  1. /etc/zshenv
  2. ~/.zshenv
  3. 로그인 방법:
    1. /etc/zprofile
    2. ~/.zprofile
  4. 인터렉티브:
    1. /etc/zshrc
    2. ~/.zshrc
  5. 로그인 방법:
    1. /etc/zlogin
    2. ~/.zlogin

여기에 이미지 설명을 입력하세요.

팁:

  • Linux 터미널에서 열리는 기본 셸은 비로그인 대화형 셸입니다. 하지만 macOS에서는 로그인 셸입니다.

인용하다

답변2

sshd클라이언트가 실행할 명령을 보내지 않은 경우 로그인 쉘을 실행합니다. 이는 실행 명령이 제공되지 않을 때의 동작이 아닌 rsh서비스를 호출하는 동작을 모방하기 위한 것입니다 .rlogindrshd

rlogind또는 login와 같은 로그인 쉘임을 쉘에 알리려면 telnetdsshd쉘을 시작하십시오 .argv[0]-

아니면 물론 zsh다른 모든 쉘도 마찬가지로 이를 이해합니다. 그렇지 않으면 절대로 호출할 수 없습니다.로그인모델.

여기서 로그인 쉘이 안 나오는 것 같은 증상은 /etc/profile설명이 없기 때문입니다.

/etc/profileBourne Shell과 유사한 로그인 세션 초기화 파일입니다. 구문은 Bourne 쉘 구문(또는 Bourne 쉘이 현재 거의 사용되지 않으므로 POSIX sh 구문일 수도 있음)일 것으로 예상되며, 로그인 시 모든 구문은 (대부분) Bourne 또는 POSIX sh 구문과 역호환됩니다.

csh그리고 tcsh완전히 다른 구문을 사용합니다 /etc/csh.login. fish사용됨 /etc/fish/config.fish(로그인 모드인지 여부)

zsh의 구문은 Bourne/POSIX와 완전히 호환되지 않으므로 기본적으로 를 읽지 않습니다 /etc/profile. 로그인 모드의 구성 파일은 입니다 /etc/zsh/zprofile(또는 빌드 시 구성 방법 /etc/zprofile에 따라 다름 ) .zsh/etc/zsh/zlogin/etc/zloginzshrc

zsh소스는 에뮬레이션 또는 에뮬레이션 /etc/profile할 때만 제공 되며 , 이 경우 구문은 기본 에뮬레이션 모드보다 POSIX sh의 구문에 더 가깝습니다 .shkshzsh

로그인 모드에서 zsh소스를 얻으 려면 추가해야 합니다 /etc/profile. source /etc/profile단, 의 구문과 해당 파일이 소스로 사용되는 다른 모든 파일이 의 구문과 호환되는지 확인한 경우에만 해당됩니다 /etc/zsh/zprofile./etc/profilezsh

또는 다음을 추가할 수 있습니다.

emulate sh -c 'source /etc/profile'

도착하다 /etc/zsh/zprofile. 그런 다음 에뮬레이션 모드에서 가져 /etc/profile옵니다 sh(그리고 그 안에 선언된 함수도 에뮬레이션 모드로 유지됩니다 sh).

관련 정보