ログインシェルを変更せずに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

おすすめ記事