Script : changer mot de passe [Résolu/Fermé]

Signaler
Messages postés
429
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 mai 2016
-
Messages postés
429
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 mai 2016
-
Salut à tous,

je suis en train de faire un script qui permet de changer le mot de passe d'un utilisateur.
Pour expliquer un peu plus précisément, j'ai un fichier users.txt qui contient le login et le mot de passe de l'utilisateur sous cette forme :
1:login_user1:mdp_user1
2:login_user2:mdp_user2
3: etc...

Mon script fonctionne très bien, sauf dans un cas particulier : si deux utilisateurs ont un mot de passe ressemblant (par exemple user1 a comme mot de passe "toto" et que user2 a comme mot de passe "toto2"), le changement de mot de passe s'opère pour les deux utilisateurs et non pour un seul et unique utilisateur. Logique vu que j'utilise la commande "sed" et donc qui recherche tous les mots ayant le critère de recherche et qui les remplacent...
Je ne sais pas comment résoudre ce problème. J'essaye de sélectionner une seule ligne de mon fichier users.txt et appliquer le "sed" uniquement à cette ligne mais je n'y arrive pas...
Auriez-vous une idée pour m'aider svp ? merci par avance.

Voici mon script (le nom d'utilisateur est entré en argument ($1) ) :


motDePasse='cat ./users.txt | grep $1 | cut -d":" -f3' #variable qui permet de récupérer le mot de passe de l'utilisateur mis en argument

echo "entrer votre ancien mot de passe : "
read -s mdp

if [ $mdp == $motDePasse ] #ici, on vérifie si le mot de passe entré est correct
then
echo "entrer votre nouveau mot de passe : "
read -s newmdp
echo "confirmer votre nouveau mot de passe : "
read -s newmdp2
if [ $newmdp == $newmdp2 ] #on vérifie que les 2 mdp sont identiques
then
cat ./users.txt | grep $1 | sed -i "s/$mdp/$newmdp/" ./users.txt
#on affiche le fichier txt, on affiche la ligne correspondant au login, on cherche $mdp et on le remplace par $newmdp

echo "le mot de passe de $1 a été changé"
else
echo -e "\nles mots de passes entrés ne correspondent pas \n "
fi
else
echo "mauvais mot de passe"
fi




6 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 532
Salut,

Voir en gras.

lami20j@debian-acer:~$ cat users.txt 
0:admin:admin 
1:flo:mdp 
2:justin:test 
3:test::mot_de_passe  
lami20j@debian-acer:~$ cat suppr.sh 
#!/bin/bash
listeUsers=$(cat ./users.txt | grep ^[0-9] | cut -d":" -f2)
#on choppe la liste des utilisateurs => admin flo justin test

echo "quel utilisateur souhaitez-vous supprimer ?"
read supprUser

while [ 0 == $(echo "$listeUsers" | egrep -c "$supprUser") ]
#tant que le nom d'un utilisateur n'est pas tapé correctement, on redemande le nom d'un utilisateur
do
  echo "$listeUsers"
  echo "utilisateur inexistant. entrer un utilisateur"
  read supprUser
done

echo "êtes-vous sûr de vouloir supprimer $supprUser ? (y - n)"
read YesOrNo

if [ $YesOrNo == "y" ]
then
  sed -i "/^[0-9]\+:${supprUser}/d" ./users.txt
#PROBLEME ICI : on supprime les lignes qui contiennent la chaine de caractère "nom d'utilisateur que l'on veut supprimer"
else
  echo "vous avez annulé la suppression"
fi

lami20j@debian-acer:~$ sh suppr.sh 
quel utilisateur souhaitez-vous supprimer ?
azerty
admin
flo
justin
test
utilisateur inexistant. entrer un utilisateur
test
êtes-vous sûr de vouloir supprimer test ? (y - n)
n
vous avez annulé la suppression
lami20j@debian-acer:~$ sh suppr.sh 
quel utilisateur souhaitez-vous supprimer ?
test
êtes-vous sûr de vouloir supprimer test ? (y - n)
y
lami20j@debian-acer:~$ cat users.txt 
0:admin:admin 
1:flo:mdp 
2:justin:test


GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
429
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 mai 2016
32
merci beaucoup
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 093
Salut,

Au lieu de :
cat ./users.txt | grep $1 | sed -i "s/$mdp/$newmdp/" ./users.txt 
Change pour :
sed -i "/$1/ s/$mdp/$newmdp/" ./users.txt 

Nul besoin du cat et du grep ;-(

;-))
Messages postés
429
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 mai 2016
32
Rholala, merci, je t'aime !
A l'origine, je n'avais pas mis le cat et le grep. Vu que ca ne marchait pas, je les ai ajouté pour tester.
Tu peux m'expliquer comment ca fonctionne ? le /$1/ en particulier. c'est une sélection ? ca applique uniquement le changement sur l'argument ?
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 093
Oui, c'est ça. On sélection un motif "/motif/" et on applique les changements qu'aux lignes contenant ce motif ;-)
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 093
De même pour récupérer le mot de passe, pour éviter tous ces pipes...

$ cat plop
1:login_user1:mdp_user1
2:login_user2:mdp_user2
3:login_user3:mdp_user3
4:login_user4:mdp_user4

$ set login_user2

$ awk -F':' '$2 ~ /'"$1"'/ { print $3 }' plop
mdp_user2


;-))
Messages postés
429
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 mai 2016
32
ok, merci beaucoup.
Reste dans le coin, mon projet est loin d'être terminé ;)
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 532
Salut,


je suis en train de faire un script qui permet de changer le mot de passe d'un utilisateur.

Tu parles de mot de passe pour accéder à sa session Linux?
Si oui, alors tes mots de passe dans le fichier sont déjà cryptés?
Si non, alors ça m'étonnerait que ça marche et si c'est le cas alors c'est une grosse faille de sécurité.
ca n'a aucun rapport avec le système.
C'est juste un projet qui fait appel à un script, dans ce script, il y a plusieurs fonctions, dont le changement de mot de passe.
et comment on fait pour que cela fonctionne, on l'ouvre avec quoi ensuite pour pouvoir mettre en oeuvre le nouveau mot de passe?
Messages postés
429
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 mai 2016
32
@zipe31 :

nouveau problème :

mon problème est au niveau de la suppression d'un user :
si on supprime un user, si le nom du user sélectionné et le même qu'une autre information d'un autre user, ca supprime les 2 users concernés. un exemple pour illustrer mes propos :

fichiers users.txt (pour rappel : 0:user:mot_de_passe )

0:admin:admin
1:flo:mdp
2:justin:test
3:test::mot_de_passe

=> si je supprime le user qui s'appelle 'test', ca va me le supprimer comme il faut (ici pas de soucis), par contre, ca va me supprimer également la ligne 2, vu que le mot de passe de 'sojustin' est 'test'.


je te copie mon code (avec explications dedans) :

listeUsers='cat ./users.txt | grep ^[0-9] | cut -d":" -f2'
#on choppe la liste des utilisateurs => admin flo justin test

echo "$listeUsers"
echo "quel utilisateur souhaitez-vous supprimer ?"
read supprUser
while [ 0 == 'echo $listeUsers | egrep -c "\<\$supprUser\>"' ]
#tant que le nom d'un utilisateur n'est pas tapé correctement, on redemande le nom d'un utilisateur
do
echo "$listeUsers"
echo "utilisateur inexistant. entrer un utilisateur"
read supprUser
done
echo "êtes-vous sûr de vouloir supprimer $supprUser ? (y - n)"
read YesOrNo
if [ $YesOrNo == "y" ]
then
sed -i "/$supprUser/d" ./users.txt
#PROBLEME ICI : on supprime les lignes qui contiennent la chaine de caractère "nom d'utilisateur que l'on veut supprimer"
else
echo "vous avez annulé la suppression"
fi
;;

t'as une idée ? faudrait faire un masque avec uniquement le f2 (c'est à dire le nom d'utilisateur), mais je sais pas faire.