Cambiare la shell (usando chsh) tramite la riga di comando in uno script


11

In uno script di avvio che imposta una macchina, voglio eseguire

chsh -s /bin/zsh

Tuttavia, questo richiede la password dell'utente. Come passo la password come parametro? O se ho il potere sudo, posso in qualche modo bypassare quel passaggio? O in alternativa, c'è un altro modo per cambiare la shell di avvio predefinita?

Risposte:


21

Quanto segue impedisce agli account bloccati di modificare le proprie shell e consente in modo selettivo alle persone di utilizzare chshse stesse SENZA sudo o su:

Installazione semplice ancora sicura:

  1. Aggiungi questa cima di /etc/pam.d/chsh:

    # This allows users of group chsh to change their shells without a password.
    #
    # Per: http://serverfault.com/questions/202468/changing-the-shell-using-chsh-via-the-command-line-in-a-script
    #
    auth       sufficient   pam_wheel.so trust group=chsh
    
  2. Crea il gruppo chsh:

    groupadd chsh
    

Per qualsiasi utente autorizzato a cambiare la shell:

    usermod -a -G chsh username

Colpo di denaro:

user@host:~$ getent passwd $USER
user:x:1000:1001::/home/user:/bin/bash
user@host:~$ chsh -s `which zsh`
user@host:~$ getent passwd $USER
user:x:1000:1001::/home/user:/usr/bin/zsh
user@host:~$ 

Soluzione funzionante, mi chiedo che questo non sia ancora stato accettato.
dimpiax,

Grazie. Questo sembra essere il modo più pulito per consentire a un utente che utilizza la solo autenticazione di keypair di cambiare shell senza sudo. Questa roba pam.d è molto interessante!
François Drolet,

4

chsh in realtà cambia la linea relativa a un utente in / etc / passwd, sebbene un utente possa cambiare la propria 'linea' in / etc / passwd. Quindi, se si desidera cambiare shell per un altro utente, è necessario il suo passwd.

Se vuoi davvero farlo (date le preoccupazioni nel post di Lorenzo e possibili problemi di sicurezza) ecco come si può fare questo:

#visudo

Ciò richiede i privilegi di root.

Supponiamo che tu stia correndo come "alice" e desideri cambiare la shell di "bob" senza password;

Aggiungi al file:

Cmnd_Alias     SHELL = /usr/bin/chsh
Runas_Alias    SH    = Bob
alice          ALL   = (SH) NOPASSWD: SHELL

Questo assicura che 'alice' possa essere eseguito su tutti gli host come utenti del gruppo SH senza password il gruppo di comandi in SHELL.

Probabilmente un po 'inverosimile per farlo in questo modo, ma è possibile.

Assicurati di leggere "man sudoers" prima di modificare il file sudores con "visudo", in particolare i messaggi relativi alla sicurezza!


Il problema sudoè che è estremamente facile aggirare e radicare un sistema. È meglio non cambiare mai a sudoersmeno che non ci sia un'esigenza specifica che non può essere soddisfatta in altro modo (eseguibile setuid / setgid, permessi di gruppo, ecc.).

2

Devi passare il nome utente; farlo tramite sudo(o tramite root) ti permetterà di impostare la password / shell di un utente senza che ti venga chiesta la vecchia password. Si prega di verificare man chshper ulteriori informazioni.

Ora la mia domanda è: perché dovresti farlo? Se si tratta di uno script di installazione, non dovresti semplicemente cambiare la shell degli utenti al momento della creazione (ovvero all'avvio adduser)? Se stai clonando un sistema in remoto, non dovresti prima cambiarlo /etc/passwd? Non vedo motivi per farlo tramite uno script, a meno che tu non abbia automatizzato l'intero processo di installazione e la selezione delle shell da installare arriva dopo la creazione del primo utente.


È per una macchina ec2 (lo script che eseguo subito dopo l'avvio della macchina). Voglio cambiare la shell iniziale predefinita. Fare "sudo chsh -s / bin / zsh nome_utente" non funziona neanche (chiede ancora la password dell'utente)

prova a usare uno script e usa #!/usr/bin/sudo -s(riga shebang). Inoltre, sei sicuro che zsh sia in / bin e non, forse, in / usr / bin? (sto solo controllando, non ho familiarità con ec2)
Lorenzog,

Questa risposta è incompleta perché presuppone l' sudoautorizzazione. Vedi il mio per un approccio diverso che non richiede sudoper l'utente medio.

0

Credo che tu possa cambiare la shell dell'utente nel /etc/passwordfile, possibilmente usando il passwdcomando. Non l'ho ancora letto, ma questo può essere utile: differenze nella shell UNIX e come cambiare la shell .


I comandi sono chsho usermod. Non modificare mai il passwdfile direttamente, utilizzare sempre il vipwcomando per quello.

0

Prova sudo chsh -s /bin/zshquindi:

  1. esci per il server
  2. riavvia il terminale
  3. accedi al server e controlla per echo $SHELL- in caso di successo è cambiato :)

Questo in realtà imposterà zsh come terminale predefinito per l'utente root.
lcguida,

@lcguida giusto.
dimpiax,
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.