Escolhendo o shell que o SSH usa?


31

Como definir o shell usado quando um usuário SSHs para um servidor. Por exemplo, 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 ssh na máquina.

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

Respostas:


34

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

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

4
Observe que o caminho para o binário deve estar no caminho /etc/shellspara que o shell seja selecionável.
Kimvais

O Ubuntu 16.04 não possui esse comando.
David.perez

@ david.perez Sim, é verdade, no o passwdpacote .
dessert

Isso não funciona quando a autenticação é feita via LDAP
Daniel Kats

10

man chsh muda shell, nem sempre funciona

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

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


Por que o -1 (15 caracteres ...)?
Noufal Ibrahim

que é um caso mais baixoL
driftcatcher

1
ssh -té necessário para obter um TTY para as últimas opções. Por padrão, se um comando (como zsh -l) for fornecido, o OpenSSH faria um shell sem login, que não alocaria o TTY para você, e -lnão mudará isso (porque isso é executado após o login).
Franklin Yu

8

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


Por alguma razão, os usuários que eu criei recentemente não tinham shell padrão. Isso funcionou para mim. Obrigado.
18714 mimimalea

2
Obrigado, esta resposta é ótima. Também não tinha uma concha aqui. Encontrei a linha myusername: x: 1000: 1000 :: / home / myusername: e adicionei / bin / bash ao final. Sair e em e minha sessão ssh está usando bash :)
Stewart Evans

6

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 um shell de login .


4

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

Como é uma conta compartilhada, posso usar zshsomente para mim mesmo com esse método.

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

AVISO Isso não oferece garantias e não parece "sábio", no entanto, 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?

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

Significado:

  1. Sua conexão com o controle remoto deve estar aberta e ativa
  2. Seu shell remoto ainda não possui o arquivo, portanto, é necessário aguardar até que o arquivo esteja lá. sleep
  3. Seu local usa sftppara colocar seu arquivo em servidor remoto, o servidor remoto é ativado sleepe origina seus scripts.

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.