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


9

Atualmente, estou trabalhando em uma rede que usa LDAP para autenticação. Tendo definido zshcomo meu shell de login, tive um problema de obter acesso remoto através sshde uma das máquinas na rede que, aparentemente, não está zshinstalada. 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 pergunta é basicamente: como posso dizer à máquina remota para usar um shell de logon diferente daquele configurado no LDAP?

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


Você já pensou em mudar seu shell LDAP para algo mais universal, como, por exemplo, /bin/she fazer com que seu ~/.profileexec remoto o shell apropriado, se disponível?
precisa saber é o seguinte

Essa seria uma opção, mas não muito limpa, então prefiro evitá-la, se possível.
Sascha

Respostas:


10

Se o seu shell de login não puder ser executado em alguma máquina, não será possível 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 sshlinha de comando, o shell de login será executado com -ce a sequência de comandos¹ como argumentos; caso contrário, o shell de logon é executado como um shell de logon sem argumento.

Se houvesse uma maneira de ignorar o shell de login, isso seria uma falha 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 git-shellpermitir apenas o acesso a um repositório git ou rsshetc.

Para fazer login na máquina, você precisará organizar /bin/zsha presença ou alterar o shell de login para algo que esteja presente.

O que eu recomendo em um ambiente heterogêneo como esse é manter o /bin/shseu shell de login, porque está presente em todos os lugares. Defina a SHELLvariável de ambiente como /bin/zshse estiver presente, para que você obtenha o zsh como um shell interativo.

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

Enquanto você está nisso, isso evita a codificação do caminho 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, chame-o a partir do seu .profile. Se você deseja usar .zprofilepara configurar as coisas, torne-o um shell de login (mas você não obterá o mesmo ambiente em máquinas onde o zsh não está presente, por isso não recomendo isso). Faça isso apenas se for um logon interativo, não quando .profilefor executado por um script, durante o logon 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-opção com espaços no meio, e envia a string resultante através da conexão. Os protocolos SSH definem o comando como uma sequência, não como uma lista de sequências.


Obrigado pela explicação detalhada. Parece que é o único caminho a percorrer, que não envolve a instalação do zsh na máquina remota, e funciona perfeitamente, por isso vou segui-lo.
Sascha

Sugiro também adicionar um teste [ "0$SHLVL" -lt 2 ]caso o shell de login padrão suporte, $SHLVLpara que bash -loutro shell possa ser executado, se necessário (por exemplo, no caso de o zsh falhar por algum motivo). Assim ssh -t host bash -l, rodaria um bashshell de login sem executar o zsh behind. Além disso, eu substituiria exec zshpor exec zsh -lpara que o .zloginarquivo seja originado.
vinc17

2

Você deve instalar o shell na máquina especificada se tiver acesso de maneira diferente ou solicitar a um administrador que faça isso por você ou alterar seu shell no ldap para um shell existente na máquina remota.

(open) sshd sempre verificará o shell do usuário e sempre executará esse shell, o que for passado para execução. Se outro shell for passado para execução, ele será executado 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 será executado "/ bin / sh -c / bin / csh '.


Leia o comentário redfast. O openssh permite que você ignore o shell padrão.
Rui F Ribeiro

@Rui F Ribeiro Se isso aconteceu, tira a lógica por trás da configuração do shell para algo como '/ bin / false' ou '/ sbin / nologin'. Se você está se referindo a alterar o shell após o login do que ok, mas faz como escrevi acima (sh -c othersh), se não houver '/ bin / sh' do que você está sem sorte. (Testado em Redhat).
Nkms

É verdade que, se o passwd tiver um shell que não esteja listado em / etc / shells, você não fará login de qualquer maneira. Mas se você conseguir fazer o login, e a menos que o sshd_config não o force a um shell específico, qualquer comando que o usuário seja capaz de executar é um jogo justo. Se você fizer mais alguns testes, por exemplo ssh -l user server "ps ax" | grep bash, é fácil perceber que o shell padrão nem sempre é chamado. O que realmente impede a outra solução de trabalho é a verificação de zsh segurança não estar em / etc / shells
Rui F Ribeiro

@Rui F Ribeiro Execute strace -f sshd no lado do servidor. Você verá algo como "execve (" / bin / bash ", [" bash "," -c "," ps "] ..." Além disso, / sbin / nologin é um shell válido em / etc / shells.
nkms

A resposta de @RuiFRibeiro redfast00 está completamente errada. nkms está certo.
Gilles 'SO- stop be evil'
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.