Changer le shell (en utilisant chsh) via la ligne de commande dans un script


11

Dans un script de démarrage qui configure une machine, je veux exécuter

chsh -s /bin/zsh

Cependant, cela demande le mot de passe de l'utilisateur. Comment passer le mot de passe comme paramètre? Ou si j'ai le pouvoir sudo, puis-je en quelque sorte contourner cette étape? Ou bien, existe-t-il une autre façon de changer le shell de démarrage par défaut?

Réponses:


21

Les éléments suivants empêchent les comptes verrouillés de modifier leurs interpréteurs de commandes et permettent aux utilisateurs de chshs'utiliser eux-mêmes SANS sudo ou su:

Configuration simple et toujours sécurisée:

  1. Ajoutez ce tout en haut 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. Créez le groupe chsh:

    groupadd chsh
    

Pour tout utilisateur autorisé à changer de shell:

    usermod -a -G chsh username

Money Shot:

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

Solution de travail, je me demande si cela n'est toujours pas accepté.
dimpiax

Merci. Cela semble être le moyen le plus propre de laisser un utilisateur utilisant un shell d'authentification uniquement par paire de clés sans sudo. Ce truc pam.d est très intéressant!
François Drolet

4

chsh change en fait la ligne appartenant à un utilisateur dans / etc / passwd, bien qu'un utilisateur ne puisse changer que sa propre 'ligne' dans / etc / passwd. Par conséquent, si vous souhaitez changer de shell pour un autre utilisateur, vous avez besoin de son mot de passe.

Si vous voulez vraiment le faire (compte tenu des préoccupations du poste de Lorenzo et des problèmes de sécurité possibles), voici comment procéder:

#visudo

Cela nécessite des privilèges root.

Supposons que vous exécutez actuellement en tant que "alice" et que vous souhaitez modifier le shell de "bob" sans mot de passe;

Ajoutez au fichier:

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

Cela garantit que «alice» peut s'exécuter sur tous les hôtes en tant qu'utilisateurs du groupe SH sans mot de passe le groupe de commandes dans SHELL.

Probablement un peu tiré par les cheveux pour le faire de cette façon, mais c'est possible.

Assurez-vous de lire "man sudoers" avant de changer le fichier sudores avec 'visudo', en particulier les messages liés à la sécurité!


Le problème sudoest qu'il est extrêmement facile de contourner et de rooter un système. Il est préférable de ne jamais changer sudoerssauf s'il existe un besoin spécifique qui ne peut être satisfait d'aucune autre manière (exécutable setuid / setgid, autorisations de groupe, etc.).

2

Vous devez transmettre le nom d'utilisateur; cela via sudo(ou par root) vous permettra de définir le mot de passe / shell d'un utilisateur sans qu'on lui demande l'ancien mot de passe. Veuillez vérifier man chshpour plus d'informations.

Maintenant ma question est: pourquoi voudriez-vous faire cela? S'il s'agit d'un script de configuration, ne devriez-vous pas simplement changer le shell des utilisateurs au moment de la création (c'est-à-dire lors du lancement adduser)? Si vous clonez un système à distance, ne devriez-vous pas le modifier en /etc/passwdpremier? Je ne vois aucune raison de le faire via un script, sauf si vous avez automatisé l'ensemble du processus d'installation et que la sélection des shells à installer intervient après la création du premier utilisateur.


C'est pour une machine ec2 (le script que j'exécute juste après le démarrage de la machine). Je veux changer le shell de démarrage par défaut. Faire "sudo chsh -s / bin / zsh nom_utilisateur" ne fonctionne pas non plus (demande toujours le mot de passe de l'utilisateur)

essayez d'utiliser un script et utilisez #!/usr/bin/sudo -s(ligne shebang). De plus, vous êtes sûr que zsh est dans / bin et pas, peut-être, dans / usr / bin? (je vérifie, je ne connais pas ec2)
lorenzog

Cette réponse est incomplète car elle suppose une sudoautorisation. Voir le mien pour une approche différente qui ne nécessite pas sudopour l'utilisateur moyen.

0

Je pense que vous pouvez changer le shell de l'utilisateur dans le /etc/passwordfichier, éventuellement en utilisant la passwdcommande. Je ne l'ai pas encore lu mais cela peut être utile: différences de shell UNIX et comment changer votre shell .


Les commandes sont chshou usermod. Ne modifiez jamais le passwdfichier directement, utilisez toujours la vipwcommande pour cela.

0

Essayez sudo chsh -s /bin/zshalors:

  1. quitter pour le serveur
  2. redémarrer le terminal
  3. connectez-vous au serveur et vérifiez par echo $SHELL- en cas de succès, il a changé :)

Cela définira en fait zsh comme terminal par défaut pour l'utilisateur root.
lcguida

@lcguida à droite.
dimpiax
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.