IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

Vérification mot de passe avec ou sans getpwuid


Sujet :

Programmation et administration système Perl

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut Vérification mot de passe avec ou sans getpwuid
    Bonjour,

    J'aimerais faire une vérification de mot de passe système en vue de l'introduire dans un script plus complet de changement de mot de passe des utilisateurs en perl. J'ai trouvé de la documentation sur la fonction getpwuid mais celle ci ne doit pas pointer sur la bonne valeur car je n'ai qu'un x en retour du mot de passe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #!/usr/bin/perl -w  
    use strict ;
    my $pwd = (getpwuid($<))[2];
    print ("$pwd \n");
    my $salt = substr($pwd, 0, 2);
    system "stty -echo";
    print "Password: ";
    chop( my $word = <STDIN>);
    print "\n";
    system "stty echo";
    if (crypt($word, $salt) ne $pwd) {
    die "Sorry...Wrong Password \n";
    } else {
    print "ok Password Good\n";
    }
    J'ai décomposé les 10 valeurs getpwuid et je n'ai pas de mot de passe dedans.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/perl -w  
    use strict;
     
    my ($name, $passwd, $uid, $gid, $quota, $comment, $gcos, $dir, $shell) = getpwuid($<);
       print "Name = $name\n";
       print "Password = $passwd\n";
       print "UID = $uid\n";
       print "GID = $gid\n";
       print "Quota = $quota\n";
       print "Comment = $comment\n";
       print "Gcos = $gcos\n";
       print "HOME DIR = $dir\n";
       print "Shell = $shell\n";
    Y a t-il une autre manière d'avoir la valeur cryptée du mot de passe de l’utilisateur?

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Le mot de passe n'est pas codé en clair, je pense. Il y a une espèce de fonction de hachage qui triture le mot de passe saisi par l'utilisateur et vérifie si le résultat de cette trituration est correct.

    Enfin, si j'ai compris la question, ce dont je ne suis pas sûr...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Merci de ta réponse Lolo

    J'aimerai juste comparer le mot de passe saisi avec l'existant....
    Le Hachage fonctionne si tu as le mot de passe cryptée ce n'est pas le cas jusqe là.
    Sinon je doit jouer avec le retour de prompt de la commande passwd

    Pour l'instant je hésite entre les fonction IO:rompt et Expect.......

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    D'aprés ce que j'ai lu sur le Net, je suis parti sur le module Expect avec ce petit script qui permet de faire un mise à jour sur un système Linux après avoir envoyé le mot de passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/perl -w  
    use strict;
    use Expect; 
     
    my $user = getpwuid ( $< ); 
    my $password = "password"; 
    print "Running 'sudo passwd ${user}'\n"; 
    my $exp = Expect->spawn("sudo apt-get update") or die "Can't acces to sudo'\n"; 
    $exp->expect(360, 
                  ["\[sudo\] password for ${user}\:" => 
                   sub { 
                     my $fh = shift; 
                     $fh->send("${password}\n"); 
                     print "sent '${password}'\n"; 
                     exp_continue; 
                   } 
                   ]);
    Dans l’état actuel cela ne fonctionne pas je pense pourtant avoir tout bien fait d’après cette page :
    http://stackoverflow.com/questions/6...ng-the-command

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    J'ai un script qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #!/usr/bin/perl -w  
    use strict;
    use Expect; 
    # http://search.cpan.org/~rgiersig/Expect-1.21/Expect.pod
    # libexpect-perl - Expect.pm - interface Expect pour Perl
     
    my $user= getpwuid( $< );
    print "Entrez votre vieux mot de passe :" ;
    my $oldpassword = <STDIN>;
    chomp($oldpassword);
     
    print "Entre votre nouveau  mot de passe :";
    my $newpassword = <STDIN>;
    chomp($newpassword);
     
    print "Running ' passwd ${user}'\n"; 
    my $exp = Expect->spawn("passwd") or die "Can t acces to passwd \n"; 
    $exp->expect(1, 
    	[qr 'Enter login\(LDAP\) password:' , 
    		sub { 
    			$spawn_ok = 1;
    			my $fh = shift; 
    			$fh->send("${oldpassword}\n"); 
    			print "sent '${oldpassword}'\n"; 
    			exp_continue; 
    		}
    	],
    	['New password: ' , 
    		sub {
    			my $fh =shift ;
    			$fh->send("${newpassword}\n");
    			print "sent '${newpassword}'\n";
    			exp_continue;
    		}
    	],
    	['Re-enter new password:' , 
    		sub {
    			my $fh =shift ;
    			$fh->send("${newpassword}\n");
    			print "sent '${newpassword}'\n";
    			exp_continue;
    		}
    	]
     
    );
    Cependant j'aimerais ajouter un contrôle du vieux mot de passe. Si le mot de passe LDAP n'est pas bon le script doit attendre la bonne valeur.... Je ne vois pas comment faire car le script ne s’arrête jamais même si le premier mot de passe est faux.....
    Merci de votre aide

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Une autre approche moins objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #!/usr/bin/perl -w  
    use strict;
    use Expect; 
    # http://search.cpan.org/~rgiersig/Expect-1.21/Expect.pod
    # libexpect-perl - Expect.pm - interface Expect pour Perl
     
    my $user= getpwuid( $< );
    print "Entrez votre vieux mot de passe :" ;
    my $oldpassword = <STDIN>;
    chomp($oldpassword);
     
    print "Entre votre nouveau  mot de passe :";
    my $newpassword = <STDIN>;
    chomp($newpassword);
     
    print "Running ' passwd ${user}'\n"; 
     
    my $exp = Expect->spawn("passwd") or die "Can t acces to passwd \n"; 
    unless ($exp->expect(1, "Enter login \(LDAP\) password:")) {} ;
    print $exp "${oldpassword}\r" ;
    unless ($exp->expect(1, "New password:")) {} ;
    print $exp "${newpassword}\r" ;
    unless ($exp->expect(1, "Re-enter new password:")) {} ;
    print $exp "${newpassword}\r" ;
    $exp->soft_close();
    J'essaie de changer unless par un operateur style if ou while pour contrôler le scalaire $oldpassword sans succès......

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Bonsoir,

    Une dernière question pour savoir si je me fait mal à la tête pour rien ou peut être que je m'exprime mal...

    Est-il possible de faire un contrôle sur le vieux mot passe pour que le script s’arrête et qu'il redémarre. J'ai quand même pensé à une boucle mais elles plantes toutes mon script.... Normalement en cas d'erreur la requête "Enter login (LDAP) password:" réapparaît....

    Merci de votre aide pour finaliser mon script

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Aparement ceci fonctionne .... Mais le script meurt si le vieux mot de passe est faux. Je ne pense pas que l'on puisse faire redémarrer un script ????
    Je passe quuand même le post en résolu vu l’intérêt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/usr/bin/perl -w  
    use strict;
    use autodie;
    use Expect; 
     
    my $user= getpwuid( $< );
    print "Entrez votre vieux mot de passe :" ;
    my $oldpassword = <STDIN>;
    chomp($oldpassword);
     
    print "Entre votre nouveau  mot de passe :";
    my $newpassword = <STDIN>;
    chomp($newpassword);
     
    print "Running ' passwd ${user}'\n"; 
    my $exp = Expect->spawn("passwd") or die "Can t acces to passwd \n"; 
    unless ($exp->expect(1, "Enter login\(LDAP\) password:")) {};
    print $exp "${oldpassword}\r" ;
    if ($exp->expect(1,"LDAP Password incorrect\: try again")) {
    die "wrong Old passwd \n"; 
     
    };
    unless ($exp->expect(1, "New password:")) {} ;
    print $exp "${newpassword}\r" ;
    unless ($exp->expect(1, "Re-enter new password:")) {} ;
    print $exp "${newpassword}\r" ;
    $exp->soft_close();

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [1.x] Vérification de mot de passe avec sfDoctrineGuardPlugin
    Par Willy55 dans le forum Symfony
    Réponses: 9
    Dernier message: 02/08/2012, 12h21
  2. Réponses: 2
    Dernier message: 05/05/2011, 12h11
  3. Réponses: 5
    Dernier message: 19/06/2007, 07h02
  4. dictionnaire vérification mot de passe
    Par philippe281281 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/07/2006, 10h46
  5. problème de MOT DE PASSE avec mysql
    Par u_brush_u dans le forum Requêtes
    Réponses: 3
    Dernier message: 11/07/2006, 12h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo