¿Elegir el shell que utiliza SSH?

¿Elegir el shell que utiliza SSH?

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

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

Respuesta1

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

La -tbandera fuerza una asignación pseudo-tty y -lgenera unashell de inicio de sesión.

Respuesta2

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

chsh -s /bin/ksh foo
chsh -s /bin/bash username

Respuesta3

man chshcambia el shell, no siempre funciona

Alternativamente, puede ingresar exec /bin/zshsu secuencia de comandos de inicio de sesión de bash. Esto reemplazará la instancia de bash con su shell.

O puedes hacerssh host "zsh -l"

Respuesta4

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

Como es una cuenta compartida, solo puedo usarla zshpara 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 pirateada de lograr lo que está buscando, como se muestra a continuación.

ADVERTENCIA Esto no tiene garantías y no parece "inteligente", sin embargo, logré colocar mi archivo local en el servidor y obtenerlo en el shell de inicio de sesión usando esto.

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?

  • RemoteCommanddefine lo que se debe ejecutar en el lado remoto.
  • LocalCommanddefine lo que se debe ejecutar en local, que se utiliza para copiar su archivo local al servidor remoto para obtenerlo. Aquí está el problema: ocurre sólo después de una conexión "exitosa" al host remoto.

Significado:

  1. Tu conexión al control remoto debe estar abierta y viva
  2. Su shell remoto aún no tiene el archivo, por lo que tiene que esperar hasta que el archivo esté allí, ergosleep
  3. Su local utiliza sftppara colocar su archivo en el servidor remoto, el servidor remoto se activa sleepy obtiene sus scripts.

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

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

información relacionada