ログインシェルを変更せずにFishがインストールされているリモートサーバーでFishをどのように使用できますか?

ログインシェルを変更せずにFishがインストールされているリモートサーバーでFishをどのように使用できますか?

私はしばしばsshいくつかの異なるサーバー上で動作しますが、それらのいくつかはインストールされていませfishんが、ほとんどはインストールされています。可能であればシェルを取得したいと思いますfish(中間ストリームの変更は常に退屈で入力した内容の記録を失います)。しかし、デフォルトのシェルを変更することは、次の理由で良い考えではありません。

  • さまざまな機械を交換する必要があります。
  • 他の多くのデバイスでLDAP経由でログインし、LDAPに保存されているシェルを変更すると、fish利用できないコンピュータがクラッシュします。
  • 通常fishPOSIX-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
  • -ttty強制割り当て(そうでない場合は、sshコマンドを指定したときのデフォルト値はno ttyです)
  • sh -c反対側にどのシェルがあるかわからないので必要です。私のパーソナルコンピュータには、異なる構文をfish使用するデフォルトのシェルがあります。if
  • which fish実行可能ファイルが見つかると成功しますfish。この場合は-edですexec(対話型とログインシェルが必要です)。
  • $SHELLそれ以外の場合は、現在のユーザーのデフォルトのシェルで置き換えられます($エスケープされます。そうしないと、「こちらから」拡張されますsh)。

-liどちらの場合も、我々は実際に得ることができることを確認するために渡されます。ログインインタラクティブシェル。-iPOSIXでは、すべてのシェルにとって必須ですが、-l「単なる」一般的な拡張ですが、それを追加しないと予期しない結果につながる可能性があります。

stdoutofは隠されていますが(通常の状況ではそれがどこにあるかはwhich関係ありません)、(cannot be findエラーメッセージ)は、最善の意図にもかかわらず、ユーザーに警告するために意図的に残ります。 。fishstderrfishfish

体験を完了するために、マイコンピュータに次のコンテンツを含むファイルを作成して、カスタムコンプリートのfishサポートを追加しました。~/.config/fish/completions/fissh.fish

complete -c fissh -w ssh

fishfisshまったく同じ有効な完了を示します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

関連情報