Modification du mot de passe user via l'application GUI

Je faisais une application graphique pour gérer les users et les groupes sous Linux!

J'ai fini avec la partie où il crée un nouvel user, mais coincé avec la partie où il donne à l'user nouvellement créé un nouveau mot de passe. Ce que mon application fait simplement est de prendre l'input requirejse (nom d'user, list de groupes et mot de passe) via une interface graphique et exécute un script en passant cette information comme argument. Disons que nous avons un count user, xyz. Si je veux changer le mot de passe pour ce count, tout ce que j'ai à faire est simplement d'exécuter la command:

passwd xyz 

Cela requestra un nouveau mot de passe. Maintenant, je peux créer un nouveau count en utilisant des scripts car toutes les informations requirejses sont transmises dans la command line.

 useradd -m -G users -g "groups" -s /bin/bash "UserName" 

Je peux exécuter un script via l'application Qt et créer l'user, mais dans passwd cmd , l'input est demandée dans l'autre ligne. Comment fait-on face à ça?

Je pense que la bonne réponse est la suivante: ne shell à un outil de command line – utiliser un appel de bibliothèque . Cela vous permettra de mieux gérer les erreurs et d'éviter le passage du mot de passe à risque sur une command line.

Une bibliothèque que vous pouvez utiliser est libuser , ce qui est relativement simple et a des bindings C et Python.

En tant que root, vous pouvez définir systématiquement le mot de passe d'un user via un script utilisant cette méthode:

 $ echo -n "$passwd" | passwd "$uname" --stdin 

Génération de passwords

J'aime utiliser l'outil de command line pwgen pour générer des passwords.

 $ passwd="`pwgen -1cny | sed 's/[\$\!]/%/g'`" $ pwgen --help Usage: pwgen [ OPTIONS ] [ pw_length ] [ num_pw ] Options supported by pwgen: -c or --capitalize Include at least one capital letter in the password -A or --no-capitalize Don't include capital letters in the password -n or --numerals Include at least one number in the password -0 or --no-numerals Don't include numbers in the password -y or --symbols Include at least one special symbol in the password -s or --secure Generate completely random passwords -B or --ambiguous Don't include ambiguous characters in the password -h or --help Print a help message -H or --sha1=path/to/file[#seed] Use sha1 hash of given file as a (not so) random generator -C Print the generated passwords in columns -1 Don't print the generated passwords in columns -v or --no-vowels Do not use any vowels so as to avoid accidental nasty words 

Mais n'est-ce pas précaire?

Non. Le mot de passe est passé via STDIN à passwd , bien qu'il puisse être possible de faire un snoop sur les process via ps , même si cela ne permet pas à un user de voir les process de root, la remise du mot de passe à passwd est murée .

Exemple

Dire que j'exécute cette command dans un terminal en tant que root:

 $ ( sleep 10; echo "supersecret" | passwd "samtest" --stdin ) & [1] 13989 

Je lance ensuite ps dans un autre terminal:

 $ ps -AOcmd | grep pass 14046 passwd samtest --stdin R pts/11 00:00:00 passwd samtest --stdin 

Après la modification du mot de passe dans le 1er terminal:

 [root@greeneggs ~]# Changing password for user samtest. passwd: all authentication tokens updated successfully. 

Qu'en est-il de l'écho à passwd?

Même cela ne fuit pas le mot de passe. Voici un autre test qui démontre cela. Tout d'abord, nous commençons cette command dans un terminal secondaire. Cela va collecter la sortie de ps .

 $ while [ 1 ]; do ps -eaf2>&1 | grep -E "echo|pass";done | tee ps.txt 

Nous exécutons ensuite notre command de définition de mot de passe:

 $ echo "supersecret" | passwd "samtest" --stdin & [1] 20055 $ Changing password for user samtest. passwd: all authentication tokens updated successfully. [1]+ Done echo "supersecret" | passwd "samtest" --stdin 

Vérifier le contenu de ps.txt montre que le mot de passe n'est pas fuit:

 $ grep supersecret ps.txt $ 

Changer la command ps nous utilisons pour ps -eaf ne le fait pas non plus couler.

passwd --help sur ma boîte indique que la root peut l'exécuter avec --stdin pour --stdin donner le nouveau mot de passe sur stdin.

La command chpasswd lit une list de paires nom d'user / mot de passe à partir de la command line pour mettre à jour un groupe d'users existants. Chaque ligne est au format

 user_name:password 

Cette command est destinée à être utilisée dans de grands environnements système où de nombreux counts sont créés en une seule fois. Pour en savoir plus sur les options de cette command, tapez

 man chpasswd