Zsh als Standard-Shell ohne Root-Zugriff festlegen

52

Ich benutze die Computer meiner Schule und möchte zshstattdessen verwenden bash. Ich würde es gerne zur Standard-Shell machen, aber ich kann keinen Befehl ausführen, $ chsh -s $(which zsh)weil ich keine Administratorrechte habe.

Gibt es eine Möglichkeit, wie ich etwas in mein .bashrceinfügen kann oder etwas, das automatisch aufgerufen wird, zshwenn es als Workaround geöffnet wird?

Zur Verdeutlichung zshist bereits installiert.

goodcow
quelle
2
Ja, fügen Sie einfach zshdie .bashrcDatei hinzu. Abmelden und einloggen und fertig!
Fedorqui
Das tut mir leid. Aber um die Frage zu beenden, habe ich gerade zshdie erste Zeile gesetzt?
3
Wenn Sie zsh in .bashrc platzieren, wird es immer ausgeführt, auch wenn bashes explizit aufgerufen wird. Legen Sie es .bash_profilestattdessen lieber ein.
Konsolebox
Sie können zsh in den Terminaleinstellungen als Standardshell festlegen (ein neues Profil erstellen).
Lmaooooo

Antworten:

68

Erstellen Sie .bash_profilein Ihrem Home-Verzeichnis die folgenden Zeilen:

export SHELL=/bin/zsh
exec /bin/zsh -l

Update: .profilefunktioniert möglicherweise als allgemeine Lösung, wenn die Standard-Shell nicht bash ist. Ich bin mir nicht sicher, ob .profileZsh auch aufruft, dass es überflüssig werden könnte, aber wir können es mit einer einfachen Überprüfung sicher tun:

export SHELL=/bin/zsh
[ -z "$ZSH_VERSION" ] && exec /bin/zsh -l

Wir können auch verwenden which, um den dynamischen Pfad zu ermitteln, zshder sich auf folgenden Wert stützt $PATH:

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l
konsolebox
quelle
Was passiert, wenn ein Linux-Administrator (root) Ihre Standard-Shell in etwas anderes als bash (aber nicht zsh) ändert, zum Beispiel ksh? Dann .bash_profilewird nicht verwiesen. Wie wäre es, wenn Sie dies .profilestattdessen einfügen?
Joshua Huber
@JoshuaHuber Letzter Test, den ich gemacht habe, .profilehat nicht funktioniert. Auch würde nicht .profilevon angerufen werden Zsh? Es könnte überflüssig werden. Hab das aber noch nicht überprüft. (Update: Es hat jetzt funktioniert, ich bin mir nicht sicher, welchen Fehler ich gemacht habe.) Haben Sie Gedanken über mögliche Nachteile bei der Verwendung .profile?
konsolebox
1
@konsolebox Bash bezieht nur Quellen, .profilewenn es .bash_profilediese nicht gibt (es sei denn, Sie beziehen sie manuell .bash_profilevon). Insbesondere bash Quellen die erste der Dateien [ .bash_profile> .bash_login> .profile] es findet. Es wird nur nach .profileeiner POSIX-Kompatibilitätsfunktion (Bourne-Shell) gesucht.
Pyrocrasty
@ Pyrocrasty In der Tat. So wie im Handbuch gesagt: "Nach dem Lesen dieser Datei sucht sie in dieser Reihenfolge nach ~ / .bash_profile, ~ / .bash_login und ~ / .profile und liest und führt Befehle von der ersten aus, die vorhanden und lesbar ist . "
Konsolebox
Es hat geklappt, ein neues Terminalprofil mit dem Befehl Benutzerdefiniert ausführen einzurichten, anstatt meine Shell in zu ändern zsh. .bash_profileund .profilehat nicht funktioniert (die Dateien wurden nicht einmal ausgeführt, Fedora 26 auf einem Universitätscomputer).
Lmaooooo
12

Normalerweise können Sie chshals Nicht-Root-Benutzer verwenden. Es ist jedoch gelegentlich deaktiviert, in der Regel auf Websites, auf denen eine Art vernetzte Benutzerdatenbank wie NIS und LDAP verwendet wird. Möglicherweise gibt es stattdessen einen ypchsh(NIS) oder einen chsh.ldap(LDAP).

chshIn der Regel sind auch nur einige zugelassene Shells zulässig , in der Regel die in aufgeführten /etc/shells.

Wenn Sie chshoder seine Varianten auf Ihrer Site nicht verwenden können , ordnen Sie Ihre Anmeldeshell execIhrer Lieblingsshell zu und legen Sie die SHELLVariable so fest, dass sie auf Ihre Lieblingsshell verweist.

  • Wenn Ihre Login - Shell ist sh, dashoder ksh: die Datei müssen Sie bearbeiten ist ~/.profile. Beachten Sie, dass diese Datei zu Beginn einer interaktiven Sitzung sowie von einigen nicht interaktiven Sitzungsstartskripten (z. B. für X11-Sitzungen) gelesen wird. Sie müssen also darauf achten, dass Sie nur dann aufrufen exec(was den aktuellen Prozess ersetzt), wenn der aktuelle Shell ist interaktiv. Mit Ausnahme der Bourne-Shell (die /bin/shvon Solaris 10 und früher) können Sie anhand des Vorhandenseins von iin der Optionsliste ( $-) erkennen, dass eine Shell interaktiv ist .

    preferred_shell=
    if [ -x /bin/zsh ]; then
      preferred_shell=/bin/zsh
    fi
    
    if [ -n "$preferred_shell" ]; then
      case $- in
        *i*) SHELL=$preferred_shell; export SHELL; exec "$preferred_shell";;
      esac
    fi

    Wenn Sie möchten, dass zsh Ihre liest .zprofile, übergeben Sie die -lOption.

  • Wenn Ihre Login-Shell ist bash, können Sie wie oben vorgehen. Alternativ können Sie diese Befehle eingeben ~/.bash_profile. Die meisten Sitzungsstartskripte lesen nur ~/.profileund nicht ~/.bash_profile, aber ich habe einige gesehen, die unter Bash und Read laufen .bash_profile, daher sollten Sie auch dort darauf achten, keine execnicht interaktive Shell aufzurufen .

  • Wenn Ihre Anmeldeshell csh oder tcsh ist, lesen Sie ein Beispiel unter Ändern der Standardshell ohne chsh- oder Administratorberechtigungen

Gilles 'SO - hör auf böse zu sein'
quelle
1

Ich glaube, der Befehl chshdient genau diesem Zweck. Ich bin mir allerdings nicht sicher, ob jede Linux / Unix-Distribution dies unterstützt. Überprüfen Sie die Manpage von chsh.

Cinsk
quelle
Einige Systeme haben es auch als passwd -s.
Stéphane Chazelas
1

Wenn Sie nicht laufen können, chshweil Sie keine Administratorrechte haben, sprechen Sie mit jemandem, der dies tut .

Höchstwahrscheinlich können Sie nicht chshals Nicht-Root-Benutzer verwendet werden, da das von Ihnen verwendete System so konfiguriert ist, dass chshes nicht funktioniert, z. B. weil das System NIS oder LDAP anstelle nur der /etc/passwdDatei verwendet. Oder vielleicht möchte der Administrator Ihres Systems nur die Kontrolle behalten.

Das Verfahren zum Ändern Ihrer Shell hängt von den Richtlinien Ihrer Organisation ab. Möglicherweise gibt es einen lokalen Befehl, der die chshnormalen Funktionen ausführt. Oder Sie müssen möglicherweise ein Support-Ticket einreichen, um eine Shell-Änderung anzufordern.

Die meisten anderen Antworten sind gut, aber wenn Ihre Administratoren angemessen reagieren, sollten Sie sich nicht die Mühe machen, Ihre Startskripte zu hacken. Ich würde wahrscheinlich nur zsh -lmanuell aufrufen, nachdem ich mich angemeldet habe, bis der Administrator mein Konto aktualisiert hat.

Eine andere Sache, die Sie beachten sollten: Manchmal können verschiedene Shells die gleichen Startdateien verwenden. Zum Beispiel, shund bashbeide ausführen kann $HOME/.profile, und cshund tcshkann sowohl ausführen $HOME/.loginund $HOME/.cshrc(obwohl Shell spezifische Startdateien wie .bashrc, .bash_profileund .tcshrcdiejenigen außer Kraft setzen kann). Wenn Ihre Standard-Shell ist /bin/cshund Sie verwenden möchten, /bin/tcshkann das Aktualisieren von .loginto invoke /bin/tcsh -leine Endlosschleife erzeugen. zshführt nicht zufällig bash-spezifische Startdateien aus, daher ist dies für Sie kein Problem.

Die meisten Schalen setzen Variablen , die identifizieren , die Sie laufen Shell ( $BASH_VERSION, $tcsh, $ZSH_VERSION). Wenn Sie Startcode schreiben, um Ihre bevorzugte Shell aufzurufen, ist es keine schlechte Idee, ihn in ein einzuschließen, ifsodass er nur ausgeführt wird, wenn Sie diese Shell nicht bereits ausführen. Verwenden Sie den Code aus der Antwort von konsolebox :

if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
    export SHELL=/bin/zsh
    exec /bin/zsh -l
fi

(Die zusätzliche Komplikation des Überprüfens, "${ZSH_VERSION:-unset}"anstatt nur "$ZSH_VERSION"die Möglichkeit zu berücksichtigen, die Sie gemacht haben set -o unset, ist eine Option, die bewirkt, dass ein Verweis auf eine undefinierte Variable ein Fehler ist.)

Keith Thompson
quelle
1

Ich kann mir einige Szenarien vorstellen.

  1. zshist nicht in /etc/shells, und das OP möchte es verwenden, ohne zshan der Eingabeaufforderung eingeben zu müssen. Mögliche Lösungen.

    a) Verwenden Sie Profiltricks, um es beim Anmelden auszuführen. Dies ist genauso effektiv wie das eigentliche Ändern der Shell.

    b) bitten den Admin hinzuzufügen , zshum /etc/shellsso können Sie chshes zu

    c) Bitten Sie den Administrator, Ihre Shell zu ändern. Dies ist nicht klug, weil Sie dadurch die Fähigkeit verlieren, einzusteigen ftp. Sie können es nur verwenden, ftpwenn Sie eine Shell haben/etc/shells

  2. Benutzer möchte eine eingeschränkte Shell am ehesten entkommen rbashoder rsh.

    Wenn .profilees bearbeitbar ist, PATHkann es durch Bearbeiten erweitert werden. Sobald Sie /binsich im Pfad befinden, können Sie bashvon innen beginnen rsh/rbashund auf den chshBefehl zugreifen, mit dem Sie die Muscheln wechseln können. Viele Befehle verfügen über Shell-Escape-Befehle, mit denen Sie eine eingeschränkte Shell verlassen und wieder auf diese zugreifen können chsh.

  3. chshfunktioniert aus irgendeinem anderen Grund nicht. Lösung a von Möglichkeit 1 ist auch hier eine Antwort.

Szenario 2 ist der einzige Grund, die Standard-Shell tatsächlich zu ändern (sie ist zu restriktiv).

Futter
quelle
-3

Ich denke nicht, dass die angegebene Antwort tatsächlich zshdie Standard-Shell macht. Es ändert einfach die Shell in zsh, sobald sich der Benutzer bei seiner Standard-Shell anmeldet . Der Benutzer wird sich weiterhin bei its anmelden, DEFAULT SHELLaber damit ändert sich die Shell zuzsh

So ändern Sie die Standardshell:

usermod -s /path/to/shell username 

Sie sollten root sein, um das zu tun.

Andernfalls ist die oben beschriebene Problemumgehung hilfreich.

Aus Kommentar hinzugefügt

chsh -s /path/to/zsh  # considered as standard as compared to usermod

und es kann vom Benutzer für sich selbst aufgerufen werden.

PradyJord
quelle
4
Die Frage besagt ziemlich deutlich, dass das Ändern der Systembenutzerdatenbank (das Bit, für das Sie root in dieser Antwort benötigen) keine Option ist.
Caleb
3
chsh -s /path/to/zshist standardmäßiger und erfordert normalerweise (aber nicht immer) keinen Root-Zugriff, anders als usermoddies immer der Fall ist. Ihre Antwort weist also mehr Probleme auf, als in der Frage bereits als nicht funktionierend angegeben ist.
Gilles 'SO - hör auf, böse zu sein'