Script : changer mot de passe

Résolu/Fermé
koma_666 Messages postés 429 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 9 mai 2016 - 4 juin 2011 à 16:19
koma_666 Messages postés 429 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 9 mai 2016 - 6 juin 2011 à 21:58
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




A voir également:

6 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
Modifié par lami20j le 6/06/2011 à 00:30
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
koma_666 Messages postés 429 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 9 mai 2016 34
6 juin 2011 à 21:58
merci beaucoup
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 juin 2011 à 16:25
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 ;-(

;-))
0
koma_666 Messages postés 429 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 9 mai 2016 34
4 juin 2011 à 16:42
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 ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 juin 2011 à 17:00
Oui, c'est ça. On sélection un motif "/motif/" et on applique les changements qu'aux lignes contenant ce motif ;-)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 juin 2011 à 17:12
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


;-))
0
koma_666 Messages postés 429 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 9 mai 2016 34
4 juin 2011 à 19:09
ok, merci beaucoup.
Reste dans le coin, mon projet est loin d'être terminé ;)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
5 juin 2011 à 08:05
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é.
0
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
et comment on fait pour que cela fonctionne, on l'ouvre avec quoi ensuite pour pouvoir mettre en oeuvre le nouveau mot de passe?
0
koma_666 Messages postés 429 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 9 mai 2016 34
5 juin 2011 à 23:56
@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.
0