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 ssh
linha de comando, o shell de login será executado com -c
e 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-shell
permitir apenas o acesso a um repositório git ou rssh
etc.
Para fazer login na máquina, você precisará organizar /bin/zsh
a 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/sh
seu shell de login, porque está presente em todos os lugares. Defina a SHELL
variável de ambiente como /bin/zsh
se 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 .zprofile
para 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 .profile
for 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/sh
e fazer com que seu~/.profile
exec remoto o shell apropriado, se disponível?