Actualmente estoy trabajando en una red que usa LDAP para la autenticación. Habiendo establecido zsh
como mi shell de inicio de sesión, me encontré con un problema de obtener acceso remoto a través ssh
de una de las máquinas en la red que, aparentemente, no se ha zsh
instalado. 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/sh
y luego, tener a su~/.profile
ejecutivo 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
ssh
línea de comando, el shell de inicio de sesión se ejecuta con-c
y 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-shell
permitir solo el acceso a un repositorio git, orssh
, etc.Para iniciar sesión en esa máquina, deberá hacer arreglos para
/bin/zsh
estar 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/sh
como su shell de inicio de sesión, porque está presente en todas partes. Establezca laSHELL
variable de entorno en/bin/zsh
si 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.zprofile
para 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.profile
se 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$SHLVL
para quebash -l
se pueda ejecutar otro shell si es necesario (por ejemplo, en caso de que zsh falle por algún motivo). Porssh -t host bash -l
lo tanto , ejecutaría unbash
shell de inicio de sesión sin ejecutar zsh detrás. Además, reemplazaríaexec zsh
porexec zsh -l
para que el.zlogin
archivo 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