이 문제와 비슷한 환경이 있습니다.대화형 및 비대화형 작업을 위한 다양한 셸
나는 현재 "공식" 기본 쉘로 tcsh를 사용하고 있습니다. 대화형 셸의 경우 기본적으로 exec /bin/bash
내 ~/.login
파일에서 가져옵니다.
bash를 비대화형 쉘로 만드는 방법이 있습니까? 즉, 이렇게 하면 ssh myserver env
쉘이 다음과 같이 인쇄 됩니다 /bin/tcsh
.~/.cshrc
어디이 작업을 수행하기 위해 거기에 뭔가를 넣을 수는 있지만 모르겠습니다.무엇나는 그것을 거기에 두었습니다. 아니면 이런 것을 넣을 수 있는 다른 장소가 있을까요?
현재 위의 ssh 명령은 비대화형 쉘을 exec /bin/bash
사용하는 경우 중단됩니다(아마도 비대화형 쉘에서 대화형 쉘을 실행하려고 하기 때문일 것입니다).~/.cshrc
내가 원하는 것을 하는 것이 가능할까요?
답변1
원격 시스템이 Linux인 경우 다음을 추가해 보십시오 ~/.tcshrc
.
if ($?SSH_CONNECTION && $shlvl == 1) then
set sh = /bin/bash
set cmdline = "`tr '\0\n' '\n\1' </proc/$$/cmdline`"
if ($#cmdline > 2) then
exec $sh -c 'exec "$0" -c "$(printf %s "$1" | tr "\1" "\n")"' $sh $cmdline[3]:q
endif
endif
ssh를 호출할 때 ssh user@host cmd
서버가 기본적으로 수행하는 작업은 user
ssh를 사용하여 로그인 셸을 호출 -c
하고 cmd
이를 인수로 전달하는 것입니다. exec /bin/bash
yours 에서 방금 호출하면 ~/.cshrc
bash는 인수 없이 호출되며 표준 입력에서 명령을 읽을 것으로 예상합니다. 즉, ssh user@host cmd
Ctrl-C 또는 Ctrl -D를 누를 때까지 "중단"된 것처럼 보입니다.
위의 kludge는 cmd
그것으로부터 인수를 얻으 려고 시도한 /proc/<pid>/cmdline
다음 /bin/bash
동일한 방식으로( ) 선택한 쉘을 호출하여 -c
및 cmd
를 인수로 전달합니다.\1
ASCII 제어 문자(Ctrl-A)가 없다고 가정합니다 .cmd
. 이것과 대부분의 합병증은 에서 개행 문자를 보존하려고 시도하는 데서 발생하며 cmd
, 내가 올바르게 하고 있는지 전혀 확신할 수 없습니다 ;-)
개선(및 단순화)을 환영합니다.
답변2
다음을 추가할 수 있습니다 ~/.ssh/authorized_keys
.
command="setenv SHELL \"`which bash\"`; if ($?SSH_ORIGINAL_COMMAND) eval 'exec bash -c $SSH_ORIGINAL_COMMAND:q'; exec bash -l" your-pub-key-here
tcsh
SSH 로그인에 이 키를 사용하면 요청된 명령 대신 로그인 셸( )에서 해석된 대로 명령줄이 실행됩니다 . 명령줄이 전달되면 $SSH_ORIGINAL_COMMAND
환경 변수에서 사용할 수 있으며 bash
실행되도록 지시합니다. 그렇지 않은 경우 bash를 로그인 쉘로 시작합니다.
우리가 설정한 $SHELL
경로는 bash
ssh 세션에서 시작된 응용 프로그램이 bash
로그인 셸을 tcsh하는 대신 선호하는 셸이 되도록 알려줍니다.