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 ssh
ligne de commande, le shell de connexion est exécuté avec -c
et 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-shell
de 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/sh
votre shell de connexion, car il est présent partout. Définissez la SHELL
variable d'environnement sur /bin/zsh
si 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 .zprofile
pour 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 .profile
est 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~/.profile
exécutable distant le shell approprié si disponible?