非対話型シェルの場合は、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方法で()選択したシェルを呼び出して-c引数cmdとして渡します。\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するのではなく、好みのシェルになるように指示します。

関連情報