Ich arbeite derzeit in einem Netzwerk, das LDAP zur Authentifizierung verwendet. Nachdem zsh
ich mich als Login-Shell festgelegt hatte, stieß ich auf das Problem, Fernzugriff ssh
auf einen der Computer im Netzwerk zu erhalten, der anscheinend nicht zsh
installiert war. Die Anmeldung schlägt mit fehl
Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist
Die Frage lautet also im Grunde: Wie kann ich den Remotecomputer anweisen, eine andere Anmeldeshell als die in LDAP konfigurierte zu verwenden?
OpenSSH_6.0p1 Debian-4 + deb7u2, OpenSSL 1.0.1e
/bin/sh
Ihre Remote-~/.profile
Exec die entsprechende Shell, falls verfügbar?Antworten:
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-Repositoryrssh
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 dieSHELL
Umgebungsvariable auf ein,/bin/zsh
wenn sie vorhanden ist. Auf diese Weise erhalten Sie zsh als interaktive Shell.Auf diese Weise können Sie vermeiden, den Pfad zu fest zu codieren
zsh
.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.¹ 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.
quelle
[ "0$SHLVL" -lt 2 ]
falls die Standard-Login-Shell dies unterstützt,$SHLVL
damitbash -l
bei Bedarf eine andere Shell ausgeführt werden kann (z. B. falls zsh aus irgendeinem Grund fehlschlägt). Somitssh -t host bash -l
würde einebash
Login-Shell ausgeführt, ohne zsh dahinter auszuführen. Außerdem würde ich ersetzenexec zsh
durch ,exec zsh -l
so dass die.zlogin
Datei stammt.Sie müssen die Shell auf dem angegebenen Computer installieren, wenn Sie auf andere Weise Zugriff haben, oder von einem Administrator anfordern, dies für Sie zu tun, oder Ihre Shell in ldap in eine Shell ändern, die auf dem Remotecomputer vorhanden ist.
(offen) sshd wird immer für die Shell - Benutzer überprüfen , und es wird immer diese Schale ausführen , was auch immer passiert ist auszuführen. Wenn eine andere Shell zur Ausführung übergeben wird, wird sie ausgeführt und als Argument an die Benutzer-Shell übergeben. Die Benutzer-Shell lautet beispielsweise '/ bin / sh', und Sie übergeben als Argument eine csh-Shell, die dann "/ bin /" ausführt. sh -c / bin / csh '.
quelle
ssh -l user server "ps ax" | grep bash
ist es leicht zu bemerken, dass die Standard-Shell nicht immer aufgerufen wird. Was es wirklich verhindert, dass die andere Lösung funktioniert, ist die Sicherheitsüberprüfung, dass zsh nicht in / etc / shells ist