Zmień powłokę sudo su

13

Ilekroć uruchamiam sudo suz mojego normalnego zsh(który używa frameworka oh-my-zsh ), shdomyślnie jestem zmuszony używać starej powłoki Bourne'a ( ) (oczywiście; jest to standardowe zachowanie w większości * podobnych do nix systemów). Jeśli uruchomię się zshod wewnątrz shpo uruchomieniu sudo su, otrzymam powłokę Z, ale bez ulepszeń od oh-my-zsh.

Czy jest jakiś sposób, aby zmienić sudo suuruchamianie powłoki zsh? Jeśli tak, to czy możliwe jest również zshuruchomienie tego wystąpienia oh-my-zsh?

Używam OS X 10.8.4.

Jules
źródło

Odpowiedzi:

21

Innym sposobem wykonania powłoki interaktywnej jest superużytkownik sudo -s, który jest używany $SHELLjako powłoka.

Jak wspomniano w komentarzach do drugiej odpowiedzi, su -s /path/to/zshnie działa w OS X.

OS X nie obsługuje zmiany powłok logowania w /etc/passwdżadnym z nich, ale możesz użyć 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/shnie jest już powłoką Bourne'a na większości platform. Jest to zgodna z POSIX wersja bash w OS X i dash w Ubuntu.

Lri
źródło
Myślę, że tego właśnie chciałoby pytanie. To zdecydowanie działało dla mnie; Dziękuję bardzo! edytuję, widzę, czego teraz chciał - nie sądzę, że tego właśnie chciał, więc nie mogę w pełni głosować za tym pytaniem, ale myślę, że i tak zasługujesz na medal. Masz odpowiedź na moje pytanie!
Wyatt8740,
4

Na stronie supodręcznika możesz to zrobić na dwa sposoby.


Pierwszą metodą jest po prostu użycie flagi -slub --shell(zakładając, że używasz systemu operacyjnego opartego na * NIX z wersją suobsługującą ten argument), a następnie ścieżki do wybranej powłoki. Jeśli nie można znaleźć przekazanej powłoki, supowraca do następującej metody, a jeśli jej nie powiedzie się, nastąpi próba jej wywołania /bin/sh.

Na przykład możesz wymusić suuruchomienie zsh(zakładając, że istnieje /bin/zsh) w:

sudo su --shell /bin/zsh

Druga metoda polega na zmodyfikowaniu domyślnej powłoki określonej dla rootużytkownika ( ostrożnie! ). Można to zrobić, edytując plik /etc/passwdi zmieniając powłokę określoną dla rootużytkownika. Aby zobaczyć, jaka powłoka jest domyślnie określona, ​​możesz uruchomić następującą komendę (zakładając, że superużytkownikiem jest root):

sudo grep root /etc/passwd 

Polecenie powinno wypisać coś podobnego root:x:0:0:root:/root:/bin/bash. Możesz po prostu zmienić /bin/bash(lub cokolwiek, co jest ustawione w systemie), aby wskazywało zshzamiast tego.

Przełom
źródło
3
Jak zawsze, uważaj na zmianę powłoki roota. Nie chcesz być w trybie pojedynczego użytkownika i mieć powłokę root, która potrzebuje / usr, gdy jest zepsuta. Przy dzierżawie upewnij się, że twoja nowa powłoka nie ma więcej zależności systemu plików niż ta, którą zastępujesz
Rich Homolka
Uruchomienie sudo su -s /bin/zsh(lub użycie --shell) zwraca su: illegal option -- s. Jestem na OS X 10.8.4; czy OS X przyjmuje inne polecenie?
Jules
@JulesMazur jaka jest wydajność cat /etc/shells? Technicznie uruchamiane będą tylko powłoki dozwolone w tym pliku, chociaż strona sumówi, że nie powinno to mieć znaczenia, jeśli suzostanie wywołane przez root: S
Przełom
cat /etc/shellszwraca /bin/zshjako akceptowalną powłokę.
Jules
2
@JulesMazur pamiętaj, aby zawsze uwzględniać system operacyjny, aby uniknąć tego rodzaju zamieszania.
terdon
1

Bardziej czystym sposobem, który ochroni również twój system na wypadek wysadzenia twojej niestandardowej powłoki, jest utworzenie pliku .profile w katalogu głównym root w /:

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

Po prostu zmień ścieżkę do żądanej powłoki zamiast bash.

cybrhippy
źródło
0

Można to łatwo zrobić za pomocą chpass:

$ sudo chpass -s /bin/zsh
użytkownik686249
źródło