Если ваша оболочка для входа не может быть запущена на каком-либо компьютере, вы не можете войти в нее через SSH или большинством других методов в этом отношении. Сервер SSH всегда выполняет вашу оболочку входа в систему. Если вы передадите команду в sshкомандной строке, то оболочка входа будет выполнена с -cкомандной строкой¹ в качестве аргументов; в противном случае оболочка входа выполняется как оболочка входа без аргумента.
Если бы был способ обойти оболочку входа, это было бы дырой в безопасности. Учетная запись может быть настроена как ограниченная учетная запись, превратив ее оболочку входа в систему в программу, которая выполняет только одну конкретную задачу; например, оболочка входа в систему может git-shellразрешить доступ только к git-репозиторию, или rsshи т. д.
Чтобы войти на этот компьютер, вам нужно либо организовать /bin/zshприсутствие, либо изменить оболочку входа на что-то, что присутствует.
В такой неоднородной среде я рекомендую придерживаться в /bin/shкачестве оболочки для входа, поскольку она присутствует везде. Задайте для SHELLпеременной среды значение, /bin/zshесли оно присутствует, и вы получите zsh в качестве интерактивной оболочки.
if [ -x /bin/zsh ]; then
export SHELL=/bin/zsh
fi
Пока вы это делаете, это позволяет избежать жесткого кодирования пути к zsh.
if SHELL=$(command -v zsh); then
export SHELL
else
unset SHELL
fi
Чтобы заставить zsh автоматически запускаться для входа в текстовом режиме, вызовите его из своего .profile. Если вы хотите использовать его .zprofileдля настройки, сделайте это оболочкой для входа (но тогда вы не получите ту же среду на машинах, где нет zsh, поэтому я не рекомендую этого). Делайте это только в том случае, если это интерактивный вход в систему, а не при .profileвыполнении сценарием, во время входа в режиме графического интерфейса и т. Д.
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
¹ Клиент SSH присоединяет его без опции аргументы с пробелами между ними, и отправляет полученную строку через соединение. Протоколы SSH определяют команду как строку, а не список строк.
/bin/shзатем сделали ли ваш удаленный~/.profileисполняющий модуль подходящей оболочкой, если она доступна?