Como usar um shell de login não padrão para login do ssh

7

Atualmente, estou trabalhando em uma rede que usa LDAP para autenticação. Tendo configurado zsh como meu shell de login, tive um problema de obter acesso remoto por meio de ssh a uma das máquinas na rede que, aparentemente, não tem zsh instalado. O login falha com

Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist

Portanto, a questão é basicamente: Como posso dizer ao computador remoto para usar um shell de login diferente daquele que foi configurado no LDAP?

OpenSSH_6.0p1 Debian-4 + deb7u2, OpenSSL 1.0.1e

    
por Sascha 08.12.2015 / 19:36

2 respostas

7

Se o seu shell de login não puder ser executado em alguma máquina, você não poderá fazer login nele por SSH ou pela maioria dos outros métodos. O servidor SSH sempre executa seu shell de login. Se você passar um comando na linha de comando ssh , o shell de login será executado com -c e a string de comando¹ como argumentos; caso contrário, o shell de login é executado como um shell de login sem argumento.

Se houvesse uma maneira de ignorar o shell de login, isso seria uma brecha de segurança. Uma conta pode ser configurada como uma conta restrita, tornando seu shell de login um programa que executa apenas uma tarefa específica; por exemplo, o shell de login pode ser git-shell para permitir somente acesso a um repositório git ou rssh , etc.

Para efetuar login nessa máquina, você precisará organizar a presença de /bin/zsh ou alterar seu shell de login para algo que esteja presente.

O que eu recomendo em um ambiente heterogêneo como esse é manter o /bin/sh como seu shell de login, porque ele está presente em todos os lugares. Defina a variável de ambiente SHELL como /bin/zsh , se estiver presente, assim você obterá o zsh como um shell interativo.

if [ -x /bin/zsh ]; then
  export SHELL=/bin/zsh
fi

Enquanto você está nisso, isso permite que você evite codificar o caminho para zsh .

if SHELL=$(command -v zsh); then
  export SHELL
else
  unset SHELL
fi

Para que o zsh seja executado automaticamente para um login no modo de texto, invoque-o em .profile . Se você quiser usar .zprofile para configurar, crie um shell de login (mas você não obterá o mesmo ambiente em máquinas onde o zsh não está presente, então eu não recomendo isso). Faça isso somente se este for um login interativo, não quando seu .profile for executado por um script, durante o login no modo GUI, etc.

if case $- in *i*) true;; *) false;; esac &&  # interactive shell
   [ -z "$ZSH_VERSION" ] &&                   # not running zsh yet
   type zsh >/dev/null 2>/dev/null; then      # zsh is present
  exec zsh
fi

¹ O cliente SSH concatena seus argumentos não opcionais com espaços intermediários e envia a string resultante através da conexão. O protocolo SSH define o comando como uma string, não uma lista de strings.

    
por 09.12.2015 / 02:18
1

Você deve instalar o shell ether na máquina especificada, se tiver acesso de uma maneira diferente ou solicitá-lo a um administrador para fazer isso por você ou alterar seu shell no ldap para um shell existente na máquina remota.

(open) sshd irá sempre verificar o shell do usuário e sempre executará aquele shell que for passado para executar. Se outro shell for passado para executar, ele será executado passando-o como um argumento para o shell do usuário, por exemplo, o shell do usuário é '/ bin / sh' e você passa como argumento um shell csh do que ele irá executar "/ bin / sh -c / bin / csh '.

    
por 08.12.2015 / 22:02

Tags