로그인 셸을 변경하지 않고 Fish가 설치된 원격 서버에서 Fish를 어떻게 사용할 수 있나요?

로그인 셸을 변경하지 않고 Fish가 설치된 원격 서버에서 Fish를 어떻게 사용할 수 있나요?

나는 종종 ssh몇 가지 다른 서버에서 실행하는데, 그 중 일부는 fish설치되어 있지 않지만 대부분은 설치되어 있습니다. 가능한 경우 쉘을 얻고 싶습니다 fish(중간 스트림을 변경하는 것은 항상 지루하고 입력한 내용의 기록을 잃게 됩니다). 그러나 기본 쉘을 변경하는 것은 다음과 같은 이유로 좋은 생각이 아닙니다.

  • 다양한 기계를 교체해야 합니다.
  • 다른 많은 장치에서 LDAP를 통해 로그인하고 LDAP에 저장된 셸을 변경하면 fish사용할 수 없는 컴퓨터가 중단됩니다.
  • 일반적으로 fishPOSIX-sh와 호환되지 않기 때문에 이를 기본 셸로 설정하면 다음을 ssh통해 스크립트에서 실행되는 명령이 중단될 수 있습니다.
  • 마지막으로, 사용자를 다른 사람과 공유하는(또는 다른 사용자로 로그인해야 하는) 일부 시스템이 있으므로 기본 쉘을 변경하는 것은 좋은 생각이 아닙니다.

ssh따라서 이상적으로는 가능한 경우 자동으로 시작되는 유사한 명령을 갖고 싶 fish거나 제공된 기본 셸을 그대로 두는 것이 좋습니다.

답변1

fissh몇 가지 실험을 거친 후 스크립트를 작성했습니다 .

#!/bin/sh
ssh "$@" -t "sh -c 'if which fish >/dev/null ; then exec fish -li; else exec \$SHELL -li; fi'"
  • "$@"전달된 모든 매개변수를 전달합니다.ssh
  • -ttty 강제 할당(그렇지 않으면 ssh명령을 지정할 때 기본값은 no tty입니다)
  • sh -c반대편에 어떤 쉘이 있는지 모르기 때문에 필요합니다. 내 개인용 컴퓨터에는 다른 구문을 fish사용하는 기본 쉘이 있습니다.if
  • which fish실행 파일이 발견되면 성공합니다 fish. 이 경우에는 -ed입니다 exec(대화형 및 로그인 쉘 필요).
  • $SHELL그렇지 않으면 현재 사용자의 기본 셸인 으로 대체됩니다 ( $이스케이프 처리됩니다. 그렇지 않으면 "이쪽에서" 확장됩니다 sh).

-li두 경우 모두 우리가 실제로 얻을 수 있는지 확인하기 위해 통과할 것입니다.로그인대화형 쉘. -iPOSIX에서는 모든 셸에 대해 필수 사항 이지만 -l"그냥" 일반적인 확장이지만 이를 추가하지 않으면 예상치 못한 결과를 초래할 수 있습니다.

stdoutof는 숨겨져 있지만(일반적인 상황에서는 그것이 어디서 발견되는지 which상관하지 않습니다 ), (cannot be find 오류 메시지)는 최선의 의도에도 불구 하고 사용자에게 경고하기 위해 의도적으로 그대로 남겨져 있습니다. .fishstderrfishfish

경험을 완성하기 위해 내 컴퓨터에 다음 콘텐츠가 포함된 파일을 생성하여 fish사용자 지정 완성에 대한 지원을 추가했습니다.~/.config/fish/completions/fissh.fish

complete -c fissh -w ssh

fishfissh정확히 동일한 유효한 완료를 나타냅니다 ssh.

답변2

나는 이 (테스트되지 않은) 작은 기대 스크립트가 같은 일을 할 것이라고 생각합니다:

#!/usr/bin/expect -f
spawn ssh {*}$argv
expect {
    {yes/no}   {send "yes\r"; exp_continue}
    -re {\$ $} {send "which fish >/dev/null && exec fish -li\r"}
}
interact

가정:

  • 귀하의 로그인 쉘은 bourne과 유사하며 "cmd1 && cmd2"를 이해합니다.
  • 로그인 시 비밀번호를 입력할 필요가 없으며,
  • 프롬프트는 달러 기호와 공백으로 끝납니다.

답변3

이제 다음을 사용하는 것이 좋습니다.XXH.

관련 정보