SSH が使用するシェルを選択しますか?

SSH が使用するシェルを選択しますか?

ユーザーがサーバーに SSH 接続するときに使用するシェルを設定するにはどうすればよいでしょうか。たとえば、BASH が苦手で ZSH を使用する必要がある場合、.zsh_profileマシンに SSH 接続するときに、プロファイル ( ) とともに ZSH がロードされるようにするにはどうすればよいでしょうか。

ssh でたくさんのパラメータを渡す必要もありません。デフォルトのシェルを設定することはできないのでしょうか?

答え1

デフォルトのシェルを変更できない場合は、ssh -t user@host 'zsh -l'これで動作します。

この-tフラグは擬似端末の割り当てを強制し、-lフラグはログインシェル

答え2

Linux 上で実行している場合は、コマンドを使用できますchsh

chsh -s /bin/ksh foo
chsh -s /bin/bash username

答え3

man chshシェルを変更するが、必ずしも機能するわけではない

あるいは、bash ログイン スクリプトを挿入することもできます。これにより、exec /bin/zshbash インスタンスがシェルに置き換えられます。

あるいは、ssh host "zsh -l"

答え4

ローカルをリモート サーバーに配置する方法がわかりません.zshrc(そこに永続的に保存しない)。これは、リモート サーバー上のログイン シェルを変更する場合に有効です。

共有アカウントなので、zshこの方法では自分しか使えません。

~/.ssh/configこれをローカルマシンのファイルに追加します。

Host yourServer
    HostName <IP, FQDN or DNS resolvable name>
    IdentityFile ~/.ssh/<your keyfile>
    RemoteCommand zsh -l
    RequestTTY force
    User <yourUsername>

以下のように、あなたが探しているものを達成するためのハック的な方法があるかもしれません。

警告 これには保証はなく、「賢明」には見えませんが、これを使用してローカル ファイルをサーバーに配置し、ログイン シェルでソースを取得することができました。

Host someHost
    HostName someIP
    IdentityFile ~/.ssh/somekey.pem
    RemoteCommand zsh -l -c 'sleep 1; source /tmp/somefile; zsh'
    PermitLocalCommand yes
    LocalCommand bash -c 'sftp %r@%h <<< "put /tmp/somefile /tmp/somefile"'
    RequestTTY force
    User someUser

使い方?

  • RemoteCommandリモート側で実行する必要があるものを定義します。
  • LocalCommandローカルで実行する必要があるものを定義します。これは、ローカル ファイルをリモート サーバーにコピーしてソースとして使用するために使用されます。ここで問題となるのは、リモート ホストへの接続が「成功した」後にのみ実行されることです。

意味:

  1. リモートへの接続は開いていて有効である必要があります
  2. リモートシェルにはまだファイルがないので、ファイルがそこにあるまで待つ必要があります。sleep
  3. ローカルはsftpファイルをリモート サーバーに配置するために使用し、リモート サーバーはsleepスクリプトから起動してソースを取得します。

かなりハックっぽいので、もっと良い方法があるかどうかも知りたいです。

更新: これは、「長い」スリープ時間の代わりに使用できます:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

関連情報