web-dev-qa-db-fra.com

Demander aux utilisateurs de changer leurs mots de passe

J'essaye de faire une commande bash changer tous les mots de passe des utilisateurs en x.

awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd

Puis-je diriger les utilisateurs renvoyés vers passwd? Je veux dire que ça va nécessiter une sorte de boucle? Si tel est le cas, veuillez faire un exemple de la façon de procéder?

1
Sam Hamblin

passwd ne lit pas les mots de passe de manière non interactive, par exemple via STDIN généré par pipe, comme alternative, vous pouvez utiliser chpasswd qui lit le mot de passe via STDIN mais a un problème de sécurité.

Le problème est que chpasswd s'attend à ce que les mots de passe soient donnés en texte clair, suivant le format:

username:password

Pour nous rendre un peu moins explicites, nous pouvons enregistrer les mots de passe séquentiellement dans des lignes distinctes dans un fichier correspondant à la sortie donnée par le awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd commande. N'oubliez pas que vous devez conserver la séquence de sortie de la commande lors de l'enregistrement des mots de passe dans le fichier.

Ensuite, nous pouvons utiliser paste pour générer le format chpasswd voulu sur son STDIN.

Par exemple:

paste -d: <(awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd)\
          /password/file | Sudo chpasswd

Ici /password/file contient les mots de passe pertinents.

Par mesure de sécurité, nous pouvons supprimer le /password/file fichier ensuite.

3
heemayl

C'est possible avec usermod -p PASSWD USERNAME et boucle while. Le problème est que PASSWD ne peut pas être en texte brut, il doit être un mot de passe crypté. Pour cela, vous pouvez utiliser mkpasswd. De cette façon, "newPassString" est crypté et reste le même pour tous les utilisateurs. Voici un exemple de ce qui peut être fait en une seule ligne de code.

$ cat userlist |  while read USERNAME; do echo "$USERNAME";Sudo usermod -p "$(mkpasswd "newPassString")" "$USERNAME"  ;done
tester
[Sudo] password for xieerqi: 
testuser
[Sudo] password for xieerqi: 

Notez que je dois entrer Sudo pour chaque Sudo appel - c'est mon réglage personnel. En version régulière, inchangée /etc/sudoers fichier, le délai est de 15 minutes par défaut, vous ne devrez donc l'entrer qu'une seule fois.

Une meilleure approche consiste à mettre le code dans un script et à appeler avec les paramètres $ 1 comme nom de fichier et $ 2 comme nouvelle chaîne de mot de passe:

 xieerqi:$ cat passScript.sh                                                                                        
#!/bin/bash
while read USERNAME; do
   echo "$USERNAME";
   usermod -p "$(mkpasswd "$2")" "$USERNAME"  
done < "$1"

xieerqi:$ chmod +x passScript.sh                                                                                   

xieerqi:$ Sudo ./passScript.sh  userlist myNewPass                                                                 
[Sudo] password for xieerqi: 
tester
testuser

xieerqi:$ su testuser
Password: 
testuser@eagle:/home/xieerqi$ 
0