私はしばしばssh
いくつかの異なるサーバー上で動作しますが、それらのいくつかはインストールされていませfish
んが、ほとんどはインストールされています。可能であればシェルを取得したいと思いますfish
(中間ストリームの変更は常に退屈で入力した内容の記録を失います)。しかし、デフォルトのシェルを変更することは、次の理由で良い考えではありません。
- さまざまな機械を交換する必要があります。
- 他の多くのデバイスでLDAP経由でログインし、LDAPに保存されているシェルを変更すると、
fish
利用できないコンピュータがクラッシュします。 - 通常
fish
POSIX-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
-t
tty強制割り当て(そうでない場合は、ssh
コマンドを指定したときのデフォルト値はno ttyです)sh -c
反対側にどのシェルがあるかわからないので必要です。私のパーソナルコンピュータには、異なる構文をfish
使用するデフォルトのシェルがあります。if
which fish
実行可能ファイルが見つかると成功しますfish
。この場合は-edですexec
(対話型とログインシェルが必要です)。$SHELL
それ以外の場合は、現在のユーザーのデフォルトのシェルで置き換えられます($
エスケープされます。そうしないと、「こちらから」拡張されますsh
)。
-li
どちらの場合も、我々は実際に得ることができることを確認するために渡されます。私ログイン私インタラクティブシェル。-i
POSIXでは、すべてのシェルにとって必須ですが、-l
「単なる」一般的な拡張ですが、それを追加しないと予期しない結果につながる可能性があります。
stdout
ofは隠されていますが(通常の状況ではそれがどこにあるかはwhich
関係ありません)、(cannot be findエラーメッセージ)は、最善の意図にもかかわらず、ユーザーに警告するために意図的に残ります。 。fish
stderr
fish
fish
体験を完了するために、マイコンピュータに次のコンテンツを含むファイルを作成して、カスタムコンプリートのfish
サポートを追加しました。~/.config/fish/completions/fissh.fish
complete -c fissh -w ssh
fish
とfissh
まったく同じ有効な完了を示します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。