この問題に似た環境があります。対話型および非対話型タスク用のさまざまなシェル
私は現在、「公式」のデフォルトシェルとして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するのではなく、好みのシェルになるように指示します。