Escolhendo o shell que o SSH usa?

23

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

Eu não quero ter que passar um monte de parâmetros com o ssh, não posso definir o shell padrão?

    
por JP Silvashy 27.01.2010 / 07:34

5 respostas

29

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

chsh -s /bin/ksh foo
chsh -s /bin/bash username
    
por 27.01.2010 / 07:36
9

man chsh altera o shell, nem sempre funciona

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

Ou você pode fazer ssh host "zsh -l"

    
por 27.01.2010 / 07:38
7

Edite / etc / passwd (se você tiver os direitos, ou peça ao administrador do seu sistema) para alterar o seu shell padrão.

    
por 27.01.2010 / 08:02
4

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

O -t flag força uma alocação pseudo-tty e o -l flag gera um shell de login .

    
por 08.03.2017 / 17:41
1

Não tenho certeza de como você pode colocar seu local .zshrc no servidor remoto (isso sem armazená-lo permanentemente), isso me permite alterar meu shell de login no servidor remoto.

Como é uma conta compartilhada, posso usar zsh apenas para mim com esse método.

Adicione isso ao seu arquivo ~/.ssh/config 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 rápida de realizar o que você está procurando, como abaixo.

ATENÇÃO Isto vem sem garantias e não parece 'sábio', porém eu consegui colocar meu arquivo local no servidor e obtê-lo no shell de login usando isto.

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?

  • RemoteCommand define o que precisa ser executado no lado remoto.
  • LocalCommand define o que precisa ser executado no local, que é usado para copiar seu arquivo local para o servidor remoto para obtê-lo. Aqui está a captura, isso acontece somente após a conexão 'bem-sucedida' ao host remoto.

Significado:

  1. Sua conexão com o remoto deve estar aberta e viva
  2. Seu shell remoto ainda não tem o arquivo, então ele precisa esperar até que o arquivo esteja lá, ergo sleep
  3. Seus usos locais sftp para colocar seu arquivo no servidor remoto, o servidor remoto é ativado a partir de sleep e origina seus scripts.

É super legal, eu gostaria de saber se há um jeito 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'

    
por 11.06.2018 / 07:39