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 ssh
Befehlszeile übergeben, wird die Anmeldeshell mit -c
und 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-shell
darin bestehen, nur den Zugriff auf ein Git-Repository rssh
usw. 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/sh
Ihre Login-Shell zu halten, da sie überall vorhanden ist. Stellen Sie die SHELL
Umgebungsvariable auf ein, /bin/zsh
wenn 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 .zprofile
zum 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 .profile
von 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/sh
Ihre Remote-~/.profile
Exec die entsprechende Shell, falls verfügbar?