Comment utiliser un shell de connection non-par défaut pour la connection ssh

Je travaille actuellement dans un réseau qui utilise LDAP pour l'authentification. Après avoir défini zsh comme shell de connection, j'ai rencontré un problème d'access distant via ssh à l'une des machines du réseau qui, apparemment, n'a pas installé zsh . La connection échoue avec

Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist

La question est donc la suivante: Comment puis-je dire à la machine distante d'utiliser un shell de connection différent de celui qui a été configuré dans LDAP?

OpenSSH_6.0p1 Debian-4 + deb7u2, OpenSSL 1.0.1e

Si votre shell de connection ne peut pas être exécuté sur une machine, vous ne pouvez pas vous y connecter via SSH ou par la plupart des autres methods. Le server SSH exécute toujours votre shell de connection. Si vous passez une command sur la command line ssh , le shell de connection est exécuté avec -c et la string de command¹ comme arguments; sinon le shell de connection est exécuté comme un shell de connection sans argument.

S'il y avait un moyen de contourner le shell de connection, ce serait un trou de security. Un count peut être configuré en tant que count restreint en faisant de son shell de connection un programme n'effectuant qu'une tâche spécifique; Par exemple, le shell de connection peut être git-shell pour autoriser uniquement l'access à un référentiel git, ou rssh , etc.

Pour vous connecter à cette machine, vous devrez soit organiser /bin/zsh pour être présent, soit changer votre shell de connection à quelque chose qui est présent.

Ce que je recommand dans un environnement hétérogène comme celui-ci est de s'en tenir à /bin/sh comme shell de connection, car il est présent partout. Définissez la variable d'environnement SHELL sur /bin/zsh si elle est présente, vous obtiendrez ainsi zsh en tant que 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 path d'access à zsh .

 if SHELL=$(command -v zsh); then export SHELL else unset SHELL fi 

Pour que zsh s'exécute automatiquement pour une connection en mode text, appelez-le depuis votre .profile . Si vous voulez utiliser .zprofile pour configurer les choses, faites-en un shell de connection (mais vous ne recevrez pas le même environnement sur les machines sur lesquelles zsh n'est pas présent). Ne le faites que s'il s'agit d'une connection interactive, pas lorsque votre .profile est exécuté par un script, pendant la connection en mode interface graphique, 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 non-option avec des espaces intermédiaires et envoie la string résultante via la connection. Les protocoles SSH définissent la command sous la forme d'une string, et non d'une list de strings.

Vous devez éther installer le shell sur la machine spécifiée si vous avez un access différent ou le requestr à un administrateur de le faire pour vous ou changer votre shell dans ldap à un shell qui existe sur la machine distante.

(open) sshd vérifiera toujours le shell de l'user et il exécutera toujours ce shell ce qui est passé à exécuter. Si un autre shell est passé à exécuter, il l'exécutera comme un argument pour le shell de l'user, par exemple le shell de l'user est '/ bin / sh' et vous passerez en argument un shell csh qu'il exécutera "/ bin / sh -c / bin / csh '.