Wenn Ihre Anmeldeshell auf einem Computer nicht ausgeführt werden kann, können Sie sich nicht über SSH oder mit den meisten anderen Methoden anmelden. Der SSH-Server führt immer Ihre Anmeldeshell aus. Wenn Sie einen Befehl in der sshBefehlszeile übergeben, wird die Anmeldeshell mit -cund der Befehlszeichenfolge¹ als Argument ausgeführt. Andernfalls wird die Anmeldeshell als Anmeldeshell ohne Argument ausgeführt.
Wenn es eine Möglichkeit gäbe, die Login-Shell zu umgehen, wäre dies eine Sicherheitslücke. Ein Konto kann als eingeschränktes Konto konfiguriert werden, indem seine Anmeldeshell zu einem Programm gemacht wird, das nur eine bestimmte Aufgabe ausführt. Beispielsweise könnte die Anmeldeshell git-shelldarin bestehen, nur den Zugriff auf ein Git-Repository rsshusw. zuzulassen .
Um sich bei diesem Computer anzumelden, müssen Sie entweder dafür sorgen /bin/zsh, dass Sie anwesend sind, oder Ihre Anmeldeshell in etwas ändern, das vorhanden ist.
In einer heterogenen Umgebung wie dieser empfehle ich, mich an /bin/shIhre Login-Shell zu halten, da sie überall vorhanden ist. Stellen Sie die SHELLUmgebungsvariable auf ein, /bin/zshwenn sie vorhanden ist. Auf diese Weise erhalten Sie zsh als interaktive Shell.
if [ -x /bin/zsh ]; then
export SHELL=/bin/zsh
fi
Auf diese Weise können Sie vermeiden, den Pfad zu fest zu codieren zsh.
if SHELL=$(command -v zsh); then
export SHELL
else
unset SHELL
fi
Rufen Sie es von Ihrem auf, damit zsh automatisch für eine Anmeldung im Textmodus ausgeführt wird .profile. Wenn Sie .zprofilezum Einrichten verwenden möchten , machen Sie es zu einer Anmeldeshell (aber dann wird auf Computern, auf denen zsh nicht vorhanden ist, nicht dieselbe Umgebung angezeigt, daher empfehle ich dies nicht). Tun Sie dies nur, wenn dies eine interaktive Anmeldung ist, nicht wenn Ihre .profilevon einem Skript ausgeführt wird, während der Anmeldung im GUI-Modus usw.
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
¹ Der SSH-Client verkettet seine Nichtoptionsargumente mit Leerzeichen dazwischen und sendet die resultierende Zeichenfolge über die Verbindung. Die SSH-Protokolle definieren den Befehl als Zeichenfolge, nicht als Liste von Zeichenfolgen.
/bin/shIhre Remote-~/.profileExec die entsprechende Shell, falls verfügbar?