특히 zsh에서 미리 정의된 설정이 있는 컴퓨터에 SSH를 통해 연결하고 싶습니다.
이를 위해 클라이언트에서 다음을 수행하려고 했습니다.이 답변):
$ ssh -t machine@domain "STARTUP_OPTION='A'; exec /path/to/zsh;"
그런 다음 .zshrc
서버에 다음이 있습니다.
if [ "$STARTUP_OPTION" = "A" ]; then
echo "Logging in with A"
fi
이것은 작동하지 않는 것 같습니다. 원격 쉘에서 쉘 변수 값을 전달할 때 특정 쉘로 로그인하는 방법은 무엇입니까?
답변1
기본적으로 SSH 연결을 통해 전송되는 유일한 환경 변수는 입니다 TERM
. 거기에 정보를 패키징할 수 있지만 서버 측에서 언패킹되는지 확인해야 합니다. 클라이언트는 다른 메시지를 전송할 수 있지만 서버는 AcceptEnv
in use 지시문을 사용하여 메시지를 수락 하도록 설정해야 합니다 /etc/sshd_config
. Debian 및 대부분의 파생 제품(Ubuntu, Mint 등)에서는 이름이 로 시작하는 모든 변수 LC_
도 SSH 서버에서 허용됩니다. 이러한 변수는 일반적으로 로케일 설정에 사용되지만 고유한 변수 중 하나를 사용하여 추가 변수를 전달할 수도 있습니다. 서버가 허용하는 경우 간단히 작성할 수 있습니다.
LC_STARTUP_OPTION=A ssh
또 다른 가능성은사용자 인증 키를 기반으로 명령 실행(이것은 ~/.ssh/authorized_keys
sshd 구성이 아닌 제어만 필요합니다).
환경 변수를 전송할 수 없는 경우 지금까지 해왔던 것처럼 명령줄에서 설정한 다음 대화형 셸을 실행할 수 있습니다. 새 셸을 실행 중이므로(동시에 대화형 셸을 실행하고 가져오기 위한 초기 명령을 지정할 수 없기 때문에 필요함) 이는 셸 변수가 아닌 환경 변수여야 합니다.
ssh -t machine@domain 'export STARTUP_OPTION="A"; exec /path/to/zsh'
또 다른 접근 방식은 표준 입력을 통해 일부 데이터를 셸에 공급한 다음 표준 입력을 터미널로 리디렉션하는 것입니다.
ssh -t localhost 'echo "echo foo; exec </dev/tty" | exec zsh -i'
stdin: is not a tty
stty: standard input: Inappropriate ioctl for device
~%
터미널을 초기화할 수 없다는 오류 메시지에도 불구하고 zsh는 세션의 대화형 부분을 올바르게 처리하는 것으로 보입니다.
답변2
export
프로세스가 변수 정의를 상속하도록 변수를 정의 할 수 있습니다 zsh
.
$ export foo=bar
$ exec zsh
$ echo $foo
bar
또는 다음을 사용하십시오 env
.
$ exec env foo=bar zsh
$ echo $foo
bar