Si votre shell de connexion ne peut pas être exécuté sur une machine, vous ne pouvez pas vous y connecter via SSH, ou par la plupart des autres méthodes d'ailleurs. Le serveur SSH exécute toujours votre shell de connexion. Si vous passez une commande sur la sshligne de commande, le shell de connexion est exécuté avec -cet la chaîne de commande¹ comme arguments; sinon, le shell de connexion est exécuté comme un shell de connexion sans argument.
S'il y avait un moyen de contourner le shell de connexion, ce serait un trou de sécurité. Un compte peut être configuré comme un compte restreint en faisant de son shell de connexion un programme qui n'effectue qu'une seule tâche spécifique; par exemple, le shell de connexion pourrait être git-shellde n'autoriser que l'accès à un référentiel git, ou rssh, etc.
Pour vous connecter à cette machine, vous devrez soit vous organiser pour /bin/zshêtre présent, soit changer votre shell de connexion en quelque chose qui est présent.
Ce que je recommande dans un environnement hétérogène comme celui-ci, c'est de s'en tenir à /bin/shvotre shell de connexion, car il est présent partout. Définissez la SHELLvariable d'environnement sur /bin/zshsi elle est présente, de cette façon vous obtiendrez zsh comme un shell interactif.
if [ -x /bin/zsh ]; then
export SHELL=/bin/zsh
fi
Pendant que vous y êtes, cela vous permet d'éviter de coder en dur le chemin vers zsh.
if SHELL=$(command -v zsh); then
export SHELL
else
unset SHELL
fi
Pour que zsh s'exécute automatiquement pour une connexion en mode texte, appelez-le depuis votre .profile. Si vous souhaitez utiliser .zprofilepour configurer les choses, faites-en un shell de connexion (mais vous n'obtiendrez pas le même environnement sur les machines où zsh n'est pas présent, donc je ne le recommande pas). Ne faites cela que s'il s'agit d'une connexion interactive, pas lorsque votre .profileest exécuté par un script, pendant la connexion en mode GUI, etc.
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
¹ Le client SSH concatène ses arguments sans option avec des espaces entre les deux et envoie la chaîne résultante via la connexion. Les protocoles SSH définissent la commande comme une chaîne, pas une liste de chaînes.
/bin/sh, puis demandez à votre~/.profileexécutable distant le shell approprié si disponible?