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.