ログインシェルが一部のマシンで実行できない場合、SSHを介して、または他のほとんどの方法でログインシェルにログインできません。SSHサーバーは常にログインシェルを実行します。sshコマンドラインでコマンドを渡す-cと、引数としてコマンド文字列¹を使用してログインシェルが実行されます。それ以外の場合、ログインシェルは引数なしのログインシェルとして実行されます。
ログインシェルをバイパスする方法があった場合、それはセキュリティホールになります。ログインシェルを1つの特定のタスクのみを実行するプログラムにすることで、アカウントを制限付きアカウントとして構成できます。たとえば、ログインシェルはgit-shellgitリポジトリrsshなどへのアクセスのみを許可することができます。
そのマシンにログインするには、/bin/zsh存在するように準備するか、ログインシェルを存在するものに変更する必要があります。
このような異種環境では/bin/sh、ログインシェルはどこにでも存在するので、ログインシェルとして使用することをお勧めします。SHELL環境変数を設定します(/bin/zsh存在する場合)。これにより、zshを対話型シェルとして取得できます。
if [ -x /bin/zsh ]; then
export SHELL=/bin/zsh
fi
これにより、へのパスをハードコーディングする必要がなくなりますzsh。
if SHELL=$(command -v zsh); then
export SHELL
else
unset SHELL
fi
テキストモードログインでzshを自動的に実行するには、から呼び出します.profile。を使用.zprofileして設定したい場合は、ログインシェルにしてください(ただし、zshが存在しないマシンでは同じ環境を取得できないため、お勧めしません)。これがインタラクティブなログインである場合にのみ、これを.profile実行してください。スクリプトによって実行されたときや、GUIモードのログイン中などではありません。
if case $- in *i*) true;; *) false;; esac && # interactive shell
[ -z "$ZSH_VERSION" ] && # not running zsh yet
type zsh >/dev/null 2>/dev/null; then # zsh is present
exec zsh
fi
¹ SSHクライアントは、間にスペースをその非オプションの引数を連結し、接続を介して、結果の文字列を送信します。SSHプロトコルは、コマンドを文字列のリストではなく、文字列として定義します。
/bin/shリモート~/.profileexecに適切なシェルがある場合はそれを適切なシェルに変更することを検討しましたか?