Cambiar el shell (usando chsh) a través de la línea de comando en un script


11

En un script de inicio que configura una máquina, quiero ejecutar

chsh -s /bin/zsh

Sin embargo, esto solicita la contraseña del usuario. ¿Cómo paso la contraseña como parámetro? O si tengo poder de sudo, ¿puedo de alguna manera omitir ese paso? O, alternativamente, ¿hay otra forma de cambiar el shell de inicio predeterminado?

Respuestas:


21

Lo siguiente evita que las cuentas bloqueadas cambien sus shells y permite selectivamente que las personas se utilicen chshSIN sudo o su:

Configuración simple que sigue siendo segura:

  1. Agregue esta parte superior de /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 el grupo chsh:

    groupadd chsh
    

Para cualquier usuario autorizado a cambiar su shell:

    usermod -a -G chsh username

Tiro de dinero:

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:~$ 

Solución de trabajo, me pregunto si esto todavía no es aceptado.
dimpiax

Gracias. Esta parece ser la forma más limpia de permitir que un usuario que usa autenticación de solo par de claves cambie el shell sin sudo. ¡Estas cosas de pam.d son muy interesantes!
François Drolet

4

chsh en realidad cambia la línea perteneciente a un usuario en / etc / passwd, aunque un usuario solo puede cambiar su propia 'línea' en / etc / passwd. Por lo tanto, si desea cambiar el shell para otro usuario, necesita su contraseña.

Si realmente quieres hacerlo (dadas las preocupaciones en la publicación de Lorenzo y las posibles preocupaciones de seguridad), así es como se puede hacer esto:

#visudo

Esto requiere privilegios de root.

Digamos que actualmente se está ejecutando como "alice" y quiere cambiar el shell de "bob" sin contraseña;

Añadir al archivo:

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

Esto asegura que 'alice' pueda ejecutarse en todos los hosts como usuarios en el grupo SH sin una contraseña del grupo de comandos en SHELL.

Probablemente sea un poco descabellado hacerlo de esta manera, pero es posible.

Asegúrese de leer "sudoers man" antes de cambiar el archivo sudores con 'visudo', ¡especialmente los mensajes relacionados con la seguridad!


El problema sudoes que es extremadamente fácil evadir y rootear un sistema. Es mejor no cambiar nunca a sudoersmenos que exista una necesidad específica que no pueda satisfacerse de otra manera (setuid / setgid ejecutable, permisos de grupo, etc.).

2

Necesita pasar el nombre de usuario; hacer esto a través de sudo(o por root) le permitirá establecer la contraseña / shell de un usuario sin que se le solicite la contraseña anterior. Por favor, consulte man chshpara obtener más información.

Ahora mi pregunta es: ¿por qué querrías hacer eso? Si se trata de un script de configuración, ¿no debería simplemente cambiar el shell de los usuarios en el momento de la creación (es decir, al iniciar adduser)? Si está clonando un sistema de forma remota, ¿no debería cambiarlo /etc/passwdprimero? No veo razones para hacerlo a través de un script, a menos que haya automatizado todo el proceso de instalación y la selección de los shells a instalar se produce después de la creación del primer usuario.


Es para una máquina ec2 (el script que ejecuto justo después de que se inicia la máquina). Quiero cambiar el shell de inicio predeterminado. Hacer "sudo chsh -s / bin / zsh user_name" tampoco funciona (todavía solicita la contraseña del usuario)

intente usar un script y use #!/usr/bin/sudo -s(línea shebang). Además, ¿está seguro de que zsh está en / bin y quizás no en / usr / bin? (solo comprobando, no estoy familiarizado con ec2)
lorenzog

Esta respuesta está incompleta porque supone un sudopermiso. Vea el mío para un enfoque diferente que no requiere sudopara el usuario promedio.


0

Intenta sudo chsh -s /bin/zsh, entonces:

  1. salir para el servidor
  2. reiniciar terminal
  3. inicie sesión en el servidor y verifique por echo $SHELL: en caso de que haya cambiado :)

Esto realmente establecerá zsh como terminal predeterminado para el usuario root.
lcguida

@lcguida a la derecha.
dimpiax
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.