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?
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.
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$