Ändern Sie die sudo su-Shell


13

Immer wenn ich sudo suvon meinem normalen System aus laufe zsh(das das oh-my-zsh- Framework verwendet), muss ich shstandardmäßig die alte Bourne-Shell ( ) verwenden (dies ist offensichtlich das Standardverhalten auf den meisten * nix-ähnlichen Systemen). Wenn ich nach dem Laufen zshvon innen shrenne sudo su, bekomme ich die Z-Shell, aber ohne die Verbesserungen von oh-my-zsh.

Gibt es eine Möglichkeit, die Shell- sudo suStarts zu ändern zsh? Wenn ja, ist es möglich, diese Startinstanz auch zshmit zu verwenden oh-my-zsh?

Ich verwende OS X 10.8.4.

Antworten:


21

Eine andere Möglichkeit, eine interaktive Shell als Superuser auszuführen sudo -s, ist die Verwendung $SHELLals Shell.

Wie in den Kommentaren in der anderen Antwort erwähnt, su -s /path/to/zshfunktioniert dies unter OS X nicht.

OS X unterstützt auch nicht das Ändern von Login-Shells /etc/passwd, aber Sie können Folgendes verwenden dscl:

$ dscl . -read /Users/root UserShell
/bin/sh
$ sudo dscl . -change /Users/root UserShell /bin/sh /bin/zsh
$ dscl . -read /Users/root UserShell
/bin/zsh
$ sudo su
My-iMac# echo $0
zsh
My-iMac# exit
$ sudo dscl . -change /Users/root UserShell /bin/zsh /bin/sh
$ 

/bin/shist auf den meisten Plattformen keine Bourne-Shell mehr. Es ist eine POSIX-kompatible Version von Bash in OS X und Dash in Ubuntu.


Dies ist, was ich denke, die Frage wollte. Es ist definitiv das, was für mich funktioniert hat; ich danke dir sehr! bearbeiten ich sehe , was er wollte jetzt - ich glaube nicht , das ist , was er wollte, so kann ich nicht recht es für diese Frage upvote, aber ich denke , Sie trotzdem eine Medaille verdienen. Du hattest die Antwort auf meine Frage!
Wyatt8740

4

Auf der suManpage gibt es zwei Möglichkeiten, dies zu erreichen.


Die erste Methode besteht darin, einfach das Flag -soder zu --shellverwenden (vorausgesetzt, Sie verwenden ein * NIX-basiertes Betriebssystem mit einer Version su, die dieses Argument unterstützt), gefolgt vom Pfad zur Shell Ihrer Wahl. Wenn die übergebene Shell nicht gefunden werden kann, wird suauf die folgende Methode zurückgegriffen. Andernfalls wird versucht, sie aufzurufen /bin/sh.

Beispielsweise können Sie das suStarten erzwingen zsh(vorausgesetzt, es existiert in /bin/zsh) wie folgt :

sudo su --shell /bin/zsh

Die zweite Methode besteht darin, die für den rootBenutzer angegebene Standard-Shell zu ändern ( Vorsicht! ). Dies kann durch Bearbeiten der Datei /etc/passwdund Ändern der für den rootBenutzer angegebenen Shell erfolgen . Um zu sehen, welche Shell standardmäßig angegeben ist, können Sie den folgenden Befehl ausführen (vorausgesetzt, der Superuser ist root):

sudo grep root /etc/passwd 

Der Befehl sollte so etwas wie ausgeben root:x:0:0:root:/root:/bin/bash. Sie können einfach die /bin/bash(oder was auch immer in Ihrem System eingestellt ist) ändern , um zshstattdessen auf zu zeigen.


3
Achten Sie wie immer darauf, die Wurzelschale zu wechseln. Sie möchten nicht im Einzelbenutzermodus sein und eine Root-Shell haben, die / usr benötigt, wenn sie defekt ist. Stellen Sie mindestens sicher, dass Ihre neue Shell nicht mehr Dateisystemabhängigkeiten aufweist als die, die Sie ersetzen
Rich Homolka

Das Ausführen sudo su -s /bin/zsh(oder Verwenden --shell) von gibt zurück su: illegal option -- s. Ich bin auf OS X 10.8.4; Nimmt OS X einen anderen Befehl an?
Jules

@JulesMazur was ist die Ausgabe von cat /etc/shells? Technisch gesehen werden nur Shells gestartet, die in dieser Datei erlaubt sind, obwohl die suManpage sagt, dass dies keine Rolle spielen sollte, wenn susie von root aufgerufen wird: S
Breakthrough

cat /etc/shellsGibt /bin/zshals akzeptable Shell zurück.
Jules

2
@JulesMazur Bitte denken Sie daran, immer Ihr Betriebssystem einzuschließen, um diese Art von Verwirrung zu vermeiden.
Terdon

1

Eine sauberere Methode, die auch Ihr System schützt, falls Ihre benutzerdefinierte Shell in die Luft gesprengt wird, besteht darin, ein .profile im Home-Verzeichnis von root zu erstellen mit:

if [ -x /opt/local/bin/bash ]; then
    SHELL=/opt/local/bin/bash
    export SHELL
    exec /opt/local/bin/bash
else
    echo /opt/local/bin/bash not found using default shell of $SHELL
fi

Ändern Sie einfach den Pfad zu der gewünschten Shell, anstatt zu schlagen.


0

Kann leicht gemacht werden mit chpass:

$ sudo chpass -s /bin/zsh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.