Script : changer mot de passe

Résolu
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

  1. Modérateur
    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
    1. merci beaucoup
      0
  2. Contributeur
    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
    1. 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
      1. Contributeur
        Oui, c'est ça. On sélection un motif "/motif/" et on applique les changements qu'aux lignes contenant ce motif ;-)
        0
      2. Contributeur
        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
    2. ok, merci beaucoup.
      Reste dans le coin, mon projet est loin d'être terminé ;)
      0
      1. Modérateur
        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
      2. 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
    3. 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
      1. @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