¿Elegir el shell que usa SSH?

31

¿Cómo configuro el shell que se utiliza cuando un usuario SSH en un servidor? Por ejemplo, no soporto BASH y necesito usar ZSH, ¿cómo lo hago para que ZSH se cargue junto con mi perfil ( .zsh_profile) cuando ssh a la máquina.

No quiero tener que pasar un montón de parámetros con ssh tampoco, ¿no puedo configurar el shell predeterminado?

JP Silvashy
fuente

Respuestas:

34

Suponiendo que esté ejecutando en Linux, puede usar el chshcomando.

chsh -s /bin/ksh foo
chsh -s /bin/bash username
Dominic Barnes
fuente
44
Tenga en cuenta que la ruta al binario debe estar dentro /etc/shellspara que el shell sea seleccionable.
Kimvais
Ubuntu 16.04 no tiene este comando.
david.perez
@ david.perez Sí, en el passwdpaquete .
postre
Esto no funciona cuando la autenticación se maneja a través de LDAP
Daniel Kats
10

man chsh cambia de caparazón, no siempre funciona

Alternativamente, puede pegar exec /bin/zshen su script de inicio de sesión bash. Esto reemplazará la instancia bash con su shell.

O puedes hacer ssh host "zsh -l"


fuente
¿Por qué el -1 (15 caracteres ...)?
Noufal Ibrahim
eso es una minúsculaL
driftcatcher
1
ssh -tse requiere para obtener un TTY para las últimas opciones. Por defecto, si se proporciona un comando (como zsh -l), OpenSSH haría un shell sin inicio de sesión, que no le asignaría TTY, y -lno lo cambiará (porque se ejecuta después de iniciar sesión).
Franklin Yu
8

Edite / etc / passwd (si tiene los derechos o solicite al administrador del sistema) que cambie su shell predeterminado.

Valentin Rocher
fuente
Por alguna razón, los usuarios que creé recientemente no tenían un shell predeterminado. Esto funcionó para mí. Gracias.
mimoralea
2
Gracias esta respuesta es genial. Yo tampoco tenía un caparazón aquí. Encontré la línea myusername: x: 1000: 1000 :: / home / myusername: y agregué / bin / bash al final. Cerrar sesión y mi sesión de ssh está usando bash :)
Stewart Evans
6

Si no puede cambiar su shell predeterminado, ssh -t user@host 'zsh -l'funciona.

La -tbandera fuerza una asignación pseudo-tty, y la -lbandera genera un shell de inicio de sesión .

marca
fuente
4

No estoy seguro de cómo puede poner su .zshrcservidor local a remoto (sin almacenarlo permanentemente allí), esto funciona para mí para cambiar mi shell de inicio de sesión en el servidor remoto.

Como es una cuenta compartida, zshsolo puedo usarla para mí con este método.

Agregue esto a su ~/.ssh/configarchivo en su máquina local.

Host yourServer
    HostName <IP, FQDN or DNS resolvable name>
    IdentityFile ~/.ssh/<your keyfile>
    RemoteCommand zsh -l
    RequestTTY force
    User <yourUsername>

Podría haber una forma hack de lograr lo que está buscando, como a continuación.

ADVERTENCIA Esto viene sin garantías y no parece 'sabio', sin embargo logré poner mi archivo local en el servidor y usarlo en el shell de inicio de sesión.

Host someHost
    HostName someIP
    IdentityFile ~/.ssh/somekey.pem
    RemoteCommand zsh -l -c 'sleep 1; source /tmp/somefile; zsh'
    PermitLocalCommand yes
    LocalCommand bash -c 'sftp %r@%h <<< "put /tmp/somefile /tmp/somefile"'
    RequestTTY force
    User someUser

¿Cómo funciona?

  • RemoteCommand define lo que debe ejecutarse en el lado remoto.
  • LocalCommanddefine lo que debe ejecutarse en local, que se utiliza para copiar su archivo local en un servidor remoto para obtenerlo. Aquí está el truco, ocurre solo después de una conexión 'exitosa' al host remoto.

Sentido:

  1. Su conexión al control remoto debe estar abierta y viva
  2. Su shell remoto aún no tiene el archivo, por lo que debe esperar hasta que el archivo esté allí, ergo sleep
  3. Sus usos locales sftppara poner su archivo en un servidor remoto, el servidor remoto se activa sleepy obtiene sus scripts.

Es súper hack, me gustaría saber si hay una mejor manera también.

Actualización: Esto se puede usar en lugar del tiempo de sueño "largo":
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

sdkks
fuente