Cambia la shell sudo su


13

Ogni volta che corro sudo sudal mio normale zsh(che usa il framework oh-my-zsh ), sono costretto a usare la vecchia shell Bourne ( sh) di default (ovviamente; questo è un comportamento standard sulla maggior parte dei sistemi * nix-like). Se corro zshdall'interno shdopo l'esecuzione sudo su, ottengo la shell Z, ma senza i miglioramenti di oh-my-zsh.

C'è un modo per cambiare il sudo sulancio della shell zsh? In tal caso, è possibile avere anche quell'istanza di zshavvio usando oh-my-zsh?

Sto usando OS X 10.8.4.

Risposte:


21

Un altro modo per eseguire una shell interattiva come superutente è sudo -s, che utilizza $SHELLcome shell.

Come indicato nei commenti nell'altra risposta, su -s /path/to/zshnon funziona in OS X.

OS X non supporta nemmeno la modifica delle shell di accesso /etc/passwd, ma è possibile utilizzare 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/shnon è più una shell Bourne sulla maggior parte delle piattaforme. È una versione conforme a POSIX di bash in OS X e trattino in Ubuntu.


Questo è ciò che penserei volesse la domanda. È sicuramente ciò che ha funzionato per me; grazie mille! modifica, vedo quello che voleva ora - Non penso che sia quello che voleva, quindi non posso esprimere il mio voto per questa domanda, ma penso che tu meriti comunque una medaglia. Hai avuto la risposta alla mia domanda!
Wyatt8740,

4

Dalla sumanpage, ci sono due modi per farlo.


Il primo metodo consiste semplicemente nell'utilizzare il flag -so --shell(supponendo che si stia utilizzando un sistema operativo basato su * NIX con una versione suche supporti questo argomento), seguito dal percorso della shell di propria scelta. Se la shell passata non può essere trovata, suripristina il metodo seguente e, in caso contrario, tenterà di richiamare /bin/sh.

Ad esempio, puoi forzare sul'avvio zsh(supponendo che esista in /bin/zsh) come:

sudo su --shell /bin/zsh

Il secondo metodo consiste nel modificare la shell predefinita specificata per l' rootutente ( fare attenzione! ). Questo può essere fatto modificando il file /etc/passwde cambiando la shell specificata per l' rootutente. Per vedere quale shell è specificata per impostazione predefinita, è possibile eseguire il comando seguente (presupponendo che il superutente sia root):

sudo grep root /etc/passwd 

Il comando dovrebbe generare qualcosa di simile root:x:0:0:root:/root:/bin/bash. Puoi semplicemente cambiare il /bin/bash(o qualunque cosa sia impostata nel tuo sistema) in modo che punti zshinvece.


3
Come sempre, fai attenzione a cambiare la shell di root. Non vuoi essere in modalità utente singolo e avere una shell di root che ha bisogno di / usr quando è rotta. Al momento del noleggio assicurati che la tua nuova shell non abbia più dipendenze del filesystem di quella che stai sostituendo
Rich Homolka

Esecuzione sudo su -s /bin/zsh(o utilizzo --shell) dei ritorni su: illegal option -- s. Sono su OS X 10.8.4; OS X prende un comando diverso?
Jules,

@JulesMazur qual è l'output di cat /etc/shells? Tecnicamente saranno lanciate solo le shell consentite in quel file, anche se la sumanpage dice che questo non dovrebbe importare se suviene chiamato da root: S
Breakthrough

cat /etc/shellsritorna /bin/zshcome shell accettabile.
Jules,

2
@JulesMazur, ricordati di includere sempre il tuo sistema operativo per evitare questo tipo di confusione.
terdon

1

Un modo più pulito che proteggerà anche il tuo sistema nel caso in cui la tua shell personalizzata venga fatta saltare è quello di creare un .profile nella home directory di root con:

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

Basta cambiare il percorso della shell desiderata invece di bash.


0

Può essere fatto facilmente con chpass:

$ sudo chpass -s /bin/zsh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.