Escolhendo o shell que o SSH usa?

Escolhendo o shell que o SSH usa?

Como defino o shell que é usado quando um usuário faz SSH para um servidor. Por exemplo, não suporto BASH e preciso usar ZSH, como faço para que o ZSH seja carregado junto com meu perfil ( .zsh_profile) quando faço ssh na máquina.

Também não quero passar vários parâmetros com ssh, não posso definir o shell padrão?

Responder1

Se você não pode alterar seu shell padrão, ssh -t user@host 'zsh -l'funciona.

O -tsinalizador força uma alocação pseudo-tty e -lgera umshell de login.

Responder2

Supondo que você esteja executando no Linux, você pode usar o chshcomando.

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

Responder3

man chshmuda de shell, nem sempre funciona

Como alternativa, você pode inserir exec /bin/zshseu script de login do bash. Isso substituirá a instância do bash pelo seu shell.

Ou você pode fazerssh host "zsh -l"

Responder4

Não tenho certeza de como você pode colocar seu servidor local .zshrcem um servidor remoto (sem armazená-lo permanentemente lá). Isso funciona para eu alterar meu shell de login no servidor remoto.

Como é uma conta compartilhada, só posso usar zshesse método para mim.

Adicione isso ao seu ~/.ssh/configarquivo em sua máquina local.

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

Pode haver uma maneira hackeada de realizar o que você procura, como abaixo.

AVISO Isso não tem garantias e não parece "sensato", mas consegui colocar meu arquivo local no servidor e obtê-lo no shell de login usando isso.

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

Como funciona?

  • RemoteCommanddefine o que precisa ser executado no lado remoto.
  • LocalCommanddefine o que precisa ser executado localmente, que é usado para copiar seu arquivo local para o servidor remoto para obtê-lo. Aqui está o problema: isso acontece somente após uma conexão 'bem-sucedida' ao host remoto.

Significado:

  1. Sua conexão remota deve estar aberta e ativa
  2. Seu shell remoto ainda não possui o arquivo, então é necessário esperar até que o arquivo esteja lá, portantosleep
  3. Seu local usa sftppara colocar seu arquivo no servidor remoto, o servidor remoto é ativado sleepe origina seus scripts.

É super hackeado, gostaria de saber se existe uma maneira melhor também.

Atualização: Isso pode ser usado em vez do tempo de sono 'longo':
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

informação relacionada