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.
/bin/she fazer com que seu~/.profileexec remoto o shell apropriado, se disponível?