Actualmente estoy trabajando en una red que usa LDAP para la autenticación. Habiendo establecido zshcomo mi shell de inicio de sesión, me encontré con un problema de obtener acceso remoto a través sshde una de las máquinas en la red que, aparentemente, no se ha zshinstalado. El inicio de sesión falla con
Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist
Entonces, la pregunta es básicamente: ¿Cómo puedo decirle a la máquina remota que use un shell de inicio de sesión diferente al que se configuró en LDAP?
OpenSSH_6.0p1 Debian-4 + deb7u2, OpenSSL 1.0.1e

/bin/shy luego, tener a su~/.profileejecutivo remoto el shell apropiado si está disponible?Respuestas:
Si su shell de inicio de sesión no se puede ejecutar en alguna máquina, entonces no puede iniciar sesión a través de SSH, o por la mayoría de los otros métodos. El servidor SSH siempre ejecuta su shell de inicio de sesión. Si pasa un comando en la
sshlínea de comando, el shell de inicio de sesión se ejecuta con-cy la cadena de comando¹ como argumentos; de lo contrario, el shell de inicio de sesión se ejecuta como un shell de inicio de sesión sin argumento.Si hubiera una manera de evitar el shell de inicio de sesión, sería un agujero de seguridad. Una cuenta puede configurarse como una cuenta restringida al hacer que su shell de inicio de sesión sea un programa que solo realiza una tarea específica; por ejemplo, el shell de inicio de sesión podría ser
git-shellpermitir solo el acceso a un repositorio git, orssh, etc.Para iniciar sesión en esa máquina, deberá hacer arreglos para
/bin/zshestar presente o cambiar su shell de inicio de sesión a algo que esté presente.Lo que recomiendo en un entorno heterogéneo como este es mantenerlo
/bin/shcomo su shell de inicio de sesión, porque está presente en todas partes. Establezca laSHELLvariable de entorno en/bin/zshsi está presente, de esa manera obtendrá zsh como un shell interactivo.Mientras lo hace, esto le permite evitar codificar el camino
zsh.Para que zsh se ejecute automáticamente para un inicio de sesión en modo de texto, invoque desde su
.profile. Si desea usarlo.zprofilepara configurar las cosas, conviértalo en un shell de inicio de sesión (pero no obtendrá el mismo entorno en máquinas donde zsh no está presente, por lo que no lo recomiendo). Haga esto solo si se trata de un inicio de sesión interactivo, no cuando.profilese ejecuta mediante un script, durante el inicio de sesión en modo GUI, etc.¹ El cliente SSH concatena sus argumentos que no sean opciones con espacios en el medio, y envía la cadena resultante a través de la conexión. Los protocolos SSH definen el comando como una cadena, no una lista de cadenas.
fuente
[ "0$SHLVL" -lt 2 ]en caso de que el shell de inicio de sesión predeterminado sea compatible$SHLVLpara quebash -lse pueda ejecutar otro shell si es necesario (por ejemplo, en caso de que zsh falle por algún motivo). Porssh -t host bash -llo tanto , ejecutaría unbashshell de inicio de sesión sin ejecutar zsh detrás. Además, reemplazaríaexec zshporexec zsh -lpara que el.zloginarchivo tenga su origen.Debe instalar el shell en la máquina especificada si tiene acceso de una manera diferente o solicitarlo a un administrador para que lo haga por usted o cambiar su shell en ldap a un shell que existe en la máquina remota.
(abierto) sshd siempre verificará el shell del usuario y siempre ejecutará ese shell lo que se haya pasado para ejecutar. Si se pasa otro shell para ejecutarlo, lo ejecutará pasándolo como argumento al shell de usuario, por ejemplo, el shell de usuario es '/ bin / sh' y usted pasa como argumento un shell csh que ejecutará "/ bin / sh -c / bin / csh '.
fuente
ssh -l user server "ps ax" | grep bash, es fácil notar que no siempre se invoca el shell predeterminado . Lo que realmente impide que la otra solución funcione es la comprobación de seguridad de que zsh no esté en / etc / shells