비대화형 쉘의 경우 tcsh 대신 bash를 사용하십시오.

비대화형 쉘의 경우 tcsh 대신 bash를 사용하십시오.

이 문제와 비슷한 환경이 있습니다.대화형 및 비대화형 작업을 위한 다양한 셸

나는 현재 "공식" 기본 쉘로 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서버가 기본적으로 수행하는 작업은 userssh를 사용하여 로그인 셸을 호출 -c하고 cmd이를 인수로 전달하는 것입니다. exec /bin/bashyours 에서 방금 호출하면 ~/.cshrcbash는 인수 없이 호출되며 표준 입력에서 명령을 읽을 것으로 예상합니다. 즉, ssh user@host cmdCtrl-C 또는 Ctrl -D를 누를 ​​때까지 "중단"된 것처럼 보입니다.

위의 kludge는 cmd그것으로부터 인수를 얻으 려고 시도한 /proc/<pid>/cmdline다음 /bin/bash동일한 방식으로( ) 선택한 쉘을 호출하여 -ccmd를 인수로 전달합니다.\1ASCII 제어 문자(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

tcshSSH 로그인에 이 키를 사용하면 요청된 명령 대신 로그인 셸( )에서 해석된 대로 명령줄이 실행됩니다 . 명령줄이 전달되면 $SSH_ORIGINAL_COMMAND환경 변수에서 사용할 수 있으며 bash실행되도록 지시합니다. 그렇지 않은 경우 bash를 로그인 쉘로 시작합니다.

우리가 설정한 $SHELL경로는 bashssh 세션에서 시작된 응용 프로그램이 bash로그인 셸을 tcsh하는 대신 선호하는 셸이 되도록 알려줍니다.

관련 정보