Rendere zsh shell predefinita senza accesso root


52

Sto usando i computer della mia scuola e mi piacerebbe usare al zshposto di bash. Vorrei renderlo la shell predefinita, ma non posso eseguire un comando come $ chsh -s $(which zsh)perché non ho i privilegi di amministratore.

C'è un modo in cui posso mettere qualcosa nel mio .bashrco qualcosa che chiama automaticamente zshquando si apre come soluzione alternativa?

Per chiarire, zshè già installato.


2
Sì, basta aggiungere zshil .bashrcfile. Esci e accedi e fatto!
fedorqui,

Mi dispiace per quello. Ma per finire la domanda, ho appena messo zshla prima riga?

3
Inserire zsh in .bashrc lo farebbe sempre eseguire anche quando bashviene chiamato esplicitamente. Meglio posizionarlo .bash_profileinvece.
Konsolebox,

È possibile impostare zsh come shell predefinita nelle preferenze del terminale (creare un nuovo profilo).
lmaooooo,

Risposte:


68

Crea .bash_profilenella tua home directory e aggiungi queste righe:

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

Aggiornamento: .profilepuò funzionare come soluzione generale quando la shell predefinita non è bash. Non sono sicuro che .profileZsh possa essere chiamato anche dal fatto che potrebbe essere ridondante, ma possiamo farlo in sicurezza con un semplice controllo:

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

Possiamo anche usare whichper ottenere il percorso dinamico di zshcui si basa sul valore di $PATH:

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l

Cosa succede se un amministratore Linux (root) cambia la shell predefinita in qualcosa di diverso da bash (ma non zsh), ad esempio ksh? Quindi .bash_profilenon verrà referenziato. Che ne dici di inserire questo .profileinvece?
Joshua Huber,

@JoshuaHuber Ultimo test che ho fatto, .profilenon ha funzionato. Inoltre non .profileverrebbe chiamato da Zsh? Potrebbe diventare ridondante. Non l'ho ancora verificato. (Aggiornamento: ora ha funzionato, non sono sicuro di quale errore ho fatto prima.) Qualche idea su possibili svantaggi dell'utilizzo .profile?
konsolebox,

1
@konsolebox Bash solo .profilese .bash_profilenon esiste (a meno che non lo si provi manualmente .bash_profile, ovviamente). In particolare, bash fonti il primo uno dei file [ .bash_profile> .bash_login> .profile] che trova. Cerca solo .profilecome funzionalità di compatibilità POSIX (Bourne shell).
piroplastica,

@pyrocrasty In effetti. Proprio come detto nel manuale: "Dopo aver letto quel file, cerca ~ / .bash_profile, ~ / .bash_login e ~ / .profile, in quell'ordine, e legge ed esegue i comandi dal primo che esiste ed è leggibile ".
konsolebox,

Ha funzionato per impostare un nuovo profilo terminale con il comando Esegui personalizzato anziché la mia shell modificata in zsh. .bash_profilee .profilenon ha funzionato (i file non sono stati nemmeno eseguiti, Fedora 26 su un computer universitario).
lmaooooo,

12

Normalmente puoi usarlo chshcome utente non root. Ma è occasionalmente disabilitato, di solito in siti che usano una qualche forma di database di utenti in rete come NIS e LDAP. Potrebbe esserci invece un ypchsh(NIS) o chsh.ldap(LDAP).

chshconsentirà inoltre solo alcune shell approvate , in genere quelle elencate in /etc/shells.

Se non riesci a utilizzare chsho le sue varianti sul tuo sito, organizza la shell di accesso sulla shell execpreferita e imposta la SHELLvariabile in modo che punti alla shell preferita.

  • Se la shell di accesso è sh, dashoppure ksh: il file che è necessario modificare è ~/.profile. Attenzione che questo file viene letto all'inizio di una sessione interattiva e da alcuni script di avvio della sessione non interattivi (ad esempio per le sessioni X11), quindi è necessario fare attenzione: chiamare solo exec(che sostituisce il processo corrente) quando l'attuale la shell è interattiva. Ad eccezione della shell Bourne (quella /bin/shdi Solaris 10 e precedenti), si può dire che una shell è interattiva dalla presenza di inell'elenco delle opzioni ( $-).

    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
    

    Se vuoi che zsh legga il tuo .zprofile, passa l' -lopzione.

  • Se la tua shell di accesso è bash, puoi procedere come sopra. In alternativa, puoi inserire questi comandi ~/.bash_profile. La maggior parte degli script di avvio della sessione legge ~/.profilee non solo ~/.bash_profile, ma ne ho visti alcuni eseguiti sotto bash e letti .bash_profile, quindi anche lì dovresti stare attento a non chiamare execin una shell non interattiva.

  • Se la shell di accesso è csh o tcsh, vedere un esempio in Modifica della shell predefinita senza privilegi di amministratore o chsh


1

Credo che il comando chshsia proprio per questo scopo. Tuttavia, non sono sicuro che ogni distribuzione Linux / Unix lo supporti. Controlla la pagina man di chsh.


Alcuni sistemi hanno anche come passwd -s.
Stéphane Chazelas,

1

Se non riesci a eseguire chshperché non hai i privilegi di amministratore, parla con qualcuno che lo possiede .

Molto probabilmente non puoi usarlo chshcome non root perché il sistema che stai utilizzando è configurato in modo che chshnon funzionerebbe, ad esempio perché il sistema utilizza NIS o LDAP anziché solo il /etc/passwdfile. O forse l'amministratore del tuo sistema vuole solo mantenere un certo controllo.

La procedura per modificare la shell dipende dalle politiche dell'organizzazione. Potrebbe esserci un comando locale che fa ciò che chshnormalmente fa. Oppure potresti dover inviare un ticket di supporto che richiede una modifica della shell.

La maggior parte delle altre risposte sono buone, ma se i tuoi amministratori sono ragionevolmente reattivi potresti non preoccuparti di hackerare gli script di avvio. Probabilmente invocerei solo zsh -lmanualmente dopo aver effettuato l'accesso fino a quando l'amministratore non si aggiorna per aggiornare il mio account.

Un'altra cosa da tenere a mente: a volte diverse shell possono usare gli stessi file di avvio. Ad esempio, she bashpuò sia eseguire $HOME/.profilee cshe tcshpuò sia eseguire $HOME/.logine $HOME/.cshrc(anche se i file di avvio specifici del guscio piace .bashrc, .bash_profilee .tcshrcpuò sovrascrivere quelli). Se la shell predefinita è /bin/cshe si desidera utilizzare /bin/tcsh, l'aggiornamento .loginper invocare /bin/tcsh -lpotrebbe creare un ciclo infinito. zshnon capita di eseguire bashfile di avvio specifici, quindi non è un problema per te.

La maggior parte dei gusci di impostare le variabili che identificano quale shell si sta eseguendo ( $BASH_VERSION, $tcsh, $ZSH_VERSION). Se hai intenzione di scrivere il codice di avvio per invocare la tua shell preferita, non è una cattiva idea racchiuderla in un ifmodo, quindi viene eseguita solo se non stai già eseguendo quella shell. Usando il codice dalla risposta di konsolebox :

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

(La complicazione aggiuntiva del controllo "${ZSH_VERSION:-unset}"anziché solo "$ZSH_VERSION"la possibilità che tu abbia fatto set -o unset, un'opzione che fa sì che un riferimento a una variabile non definita sia un errore.)


1

Mi vengono in mente alcuni scenari.

  1. zshnon è presente /etc/shellse l'OP desidera utilizzarlo senza dover digitare zshal prompt dei comandi. Possibili soluzioni.

    a) utilizzare i trucchi del profilo per eseguirlo all'accesso. Questo è efficace quanto cambiare la shell.

    b) chiedere all'amministratore di aggiungerlo zshin /etc/shellsmodo da poterlo chshfare

    c) chiedere all'amministratore di cambiare la shell. questo non è saggio, perché ti farà perdere la possibilità di entrare ftp. Puoi usarlo solo ftpse hai una shell dentro/etc/shells

  2. l'utente desidera uscire da una shell limitata, molto probabilmente rbasho rsh.

    Se .profileè modificabile, PATHpuò essere espanso modificandolo. Una volta che /binè nel percorso, puoi quindi iniziare bashdall'interno rsh/rbash, ottenendo l'accesso al chshcomando per permetterti di cambiare shell. Molti comandi hanno escape della shell che possono essere usati per sfuggire a una shell limitata e riottenere l'accesso chsh.

  3. chshdavvero non funziona a causa di altri motivi. la soluzione a dalla possibilità 1 è una risposta anche qui.

Lo scenario 2 è l'unico motivo per modificare effettivamente la shell predefinita (è troppo restrittivo).


-3

Non credo che la risposta fornita in realtà costituisca zshla shell predefinita. Semplicemente cambia la shell in zsh non appena l'utente accede alla sua shell predefinita . L'utente accederà comunque al suo DEFAULT SHELLma con questo, la shell cambierà inzsh

Per modificare la shell predefinita usare:

usermod -s /path/to/shell username 

Dovresti essere root per farlo.

In caso contrario, la soluzione precedente sarà utile.

Aggiunto dal commento

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

e può essere invocato dall'utente per se stesso.


4
La domanda afferma chiaramente che la modifica del database degli utenti di sistema (il bit che è necessario eseguire come root in questa risposta) non è un'opzione.
Caleb,

3
chsh -s /path/to/zshè più standard e di solito (ma non sempre) non richiede l'accesso come root, a differenza del solito usermod. Quindi la tua risposta ha più problemi di quelli che la domanda afferma già come non funzionanti.
Gilles 'SO- smetti di essere malvagio' il
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.