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

Langage Perl Discussion :

Fonction qui ne s'execute pas


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut Fonction qui ne s'execute pas
    Bonjour,

    Je suis en train de réaliser un script qui permet de créer des comptes sur des serveurs UNIX (2ème version car la première était un peu une usine à gaz ).
    Cette fois j'ai décidé de poser les questions à l'utilisateur via la console windows.

    La récupération par <STDIN> fonctionne à merveille mais pour les mots de passe, il faut avouer que ce n'est pas le top. Je me suis donc tourner vers le module Term::ReadPassword::Win32 (trouvé dans les sources Perl, merci aux contributeurs).

    Voici mon code :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    GetOptions("server:s" => \my $server, "login:s" => \my $login, "account:s" => \my $account, "uid:s" => \my $uid);
     
    $server = FindServer($server);
    $login = FindLogin($server);
    my $password = FindPassword($login);
    $account = FindAccount($server);
    $uid = FindUid($login);
    ...
    sub FindServer
    {
        if (defined($server))
        {
            return $server;
        }
        else
        {
            print "De quel serveur parle-t-on ?\n";
            $server = <STDIN>;
            chomp($server);
            return $server;
        }
    }
     
    sub FindLogin
    {
        my $server = shift;
        print "Avec quel login souhaitez vous vous connecter au serveur $server ?\n";
        $login = <STDIN>;
        chomp($login);
        return $login;
    }
     
    sub FindPassword
    {
        my $login = shift;
        $password = read_password("Quel password souhaitez vous utiliser avec le compte $login ?\n");
        chomp($password);
        return $password;
    }
     
    sub FindAccount
    {
        my $server = shift;
        if (defined($account))
        {
            return $account;
        }
        else
        {
            print "Quel identifiant allons nous créer sur $server ?\n";
            $account = <STDIN>;
            chomp($account);
            return $account;
        }
    }
     
    sub FindUid
    {
        my $login = shift;
        if (defined($uid))
        {
            return $uid;
        }
        else
        {
            print "Quel IUD est attaché au login $login ?\n";
            $uid = <STDIN>;
            chomp($uid);
            return $uid;
        }
    }
    Si j'utilise <STDIN> pour la fonction FindPassword tout va bien. Le problème est que si j'utilise la fonction read_password() du module Term::ReadPassword::Win32, les fonctions FindAccount() et FindUid sont zappé comme si $account et $uid était définit alors que ce n'est pas le cas..

    Merci d'avances aux personnes qui m'apporteront leurs lumières.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Avant toute chose. Met en début de tes scripts Perl ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use warnings;
    use strict;
    Tu verras que tu as des soucis de déclaration de variables. De plus, ton code n'est pas correctement indenté et tes procédures ne récupères pas proprement les arguments.

  3. #3
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Bonjour djibril,

    J'utilise bien les pragmas mais je n'ai pas collé tout le code en pensant être plus clair. Voici la source complète :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    #!/usr/bin/perl
    use strict;
    use warnings;
    #
    # Loading modules
    #
    use File::Basename;
    use Getopt::Long;
    use Term::ReadPassword::Win32;
    use Net::Telnet ();
    #
    # Global variable
    #
    my $root_password = "";
    my $account_password = "";
    #
    ###### Start Of Script #####
    #
    GetOptions("server:s" => \my $server, "login:s" => \my $login, "account:s" => \my $account, "uid:s" => \my $uid);
     
    $server = FindServer($server);
    $login = FindLogin($server);
    my $password = FindPassword($login);
    $account = FindAccount($server);
    $uid = FindUid($account);
    #
    # Command
    #
    my $add_user = "/usr/sbin/useradd -u $uid -g 20 -d /u/$account -s /usr/bin/ksh -m $account";
    my $add_password = "/usr/sam/lbin/usermod.sam -p $account_password $account";
    #
    # connection sever
    #
    print "[+] Connect to server $server with the login $login..\n";
    # DEBUG
    my $connexion = new Net::Telnet (Timeout => 10, Prompt => "/[>] $/", Dump_Log   => 'telnet.txt', Errmode=>'return', Input_log  => 'input.log', Output_log => 'output.log') or die "Can't connect:$!";
    #~ my $connexion = new Net::Telnet (Timeout => 10, Prompt => "/[>] $/", Errmode=>'return',) or die "Can't connect:$!";
    $connexion->open($server);
    $connexion->login($login, $password);
    $connexion->waitfor("/[>] $/");
    #
    # Check if the user exists before creating
    #
    print "[+] Search if the account $account exists..\n";
    my @results = $connexion->cmd("more /etc/passwd | grep $account\n");
    if ($results[0] =~ /$account/)
    {
        print "[+] The account $account already exists on the machine $server !\n";
    }
    else
    {
        print "[+] ..\n";
        $connexion->cmd("su\n");
        $connexion->waitfor('/password: ?$/i') or die "no old password prompt: ", $connexion->lastline;
        $connexion->print("$root_password\n");
        print "[+] executing the first command..\n";
        $connexion->cmd("touch toto\n");
        #~ $connexion->cmd("$add_user\n");
        #~ print "[+] Executing the second command..\n";
        #~ $connexion->cmd("$add_password\n");
    }
    print "[+] Disconnecting from server $server..\n";
    $connexion->close;
     
    #
    # Functions
    #
    sub FindServer
    {
        if (defined($server))
        {
            return $server;
        }
        else
        {
            print "On what server to connect ?\n";
            $server = <STDIN>;
            chomp($server);
            return $server;
        }
    }
     
    sub FindLogin
    {
        my $server = shift;
        if (defined($login))
        {
            return $login;
        }
        else
        {
            print "With what you want to login to connect to server $server ?\n";
            $login = <STDIN>;
            chomp($login);
            return $login;
        }
    }
     
    sub FindPassword
    {
        my $login = shift;
        $password = read_password("Quel password souhaitez vous utiliser avec le compte $login ?\n");
        #~ print "What password you want to use with the account $login ?\n";
        #~ my $password = <STDIN>;
        chomp($password);
        return $password;
    }
     
    sub FindAccount
    {
        my $server = shift;
        if (defined($account))
        {
            return $account;
        }
        else
        {
            print "What you want to create account on the server $server ?\n";
            $account = <STDIN>;
            chomp($account);
            return $account;
        }
    }
     
    sub FindUid
    {
        my $account = shift;
        if (defined($uid))
        {
            return $uid;
        }
        else
        {
            print "IUD ?\n";
            $uid = <STDIN>;
            chomp($uid);
            return $uid;
        }
    }
    #
    ###### End Of Script #####
    #
    et voici le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    D:\cassis2k\_scripts>UserUnix.pl
    On what server to connect ?
    machine1
    With what you want to login to connect to server machine1 ?
    cassis2k
    Quel password souhaitez vous utiliser avec le compte cassis2k ?
     
    What you want to create account on the server machine1 ?
    IUD ?
    [+] Connect to server machine1 with the login cassis2k..
    [+] Search if the account  exists..
    [+] The account  already exists on the machine machine1 !
    [+] Disconnecting from server machine1..
    Sinon pour être franc, je ne comprends pas ta remarque sur l'indentation

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Voici un code bien indenté et un peu corrigé.
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    #
    # Loading modules
    #
    use File::Basename;
    use Getopt::Long;
    use Term::ReadPassword::Win32;
    use Net::Telnet;
    $|++;
     
    #
    # Global variable
    #
    my $root_password    = "";
    my $account_password = "";
     
    #
    ###### Start Of Script #####
    #
    GetOptions(
      "server:s"  => \my $server,
      "login:s"   => \my $login,
      "account:s" => \my $account,
      "uid:s"     => \my $uid
    );
     
    $server  = FindServer($server);
    $login   = FindLogin($login);
    $account = FindAccount($account);
    $uid     = FindUid($uid);
    my $password = FindPassword($login);
     
    #
    # Command
    #
    my $add_user     = "/usr/sbin/useradd -u $uid -g 20 -d /u/$account -s /usr/bin/ksh -m $account";
    my $add_password = "/usr/sam/lbin/usermod.sam -p $account_password $account";
     
    #
    # connection sever
    #
    print "[+] Connect to server $server with the login $login..\n";
     
    # DEBUG
    my $connexion = new Net::Telnet(
      Timeout    => 10,
      Prompt     => "/[>] $/",
      Dump_Log   => 'telnet.txt',
      Errmode    => 'return',
      Input_log  => 'input.log',
      Output_log => 'output.log'
    ) or die "Can't connect:$!";
     
    #~ my $connexion = new Net::Telnet (Timeout => 10, Prompt => "/[>] $/", Errmode=>'return',) or die "Can't connect:$!";
    $connexion->open($server);
    $connexion->login( $login, $password );
    $connexion->waitfor("/[>] $/");
     
    #
    # Check if the user exists before creating
    #
    print "[+] Search if the account $account exists..\n";
    my @results = $connexion->cmd("more /etc/passwd | grep $account\n");
    if ( $results[0] =~ /$account/ ) {
      print "[+] The account $account already exists on the machine $server !\n";
    }
    else {
      print "[+] ..\n";
      $connexion->cmd("su\n");
      $connexion->waitfor('/password: ?$/i') or die "no old password prompt: ", $connexion->lastline;
      $connexion->print("$root_password\n");
      print "[+] executing the first command..\n";
      $connexion->cmd("touch toto\n");
     
      #~ $connexion->cmd("$add_user\n");
      #~ print "[+] Executing the second command..\n";
      #~ $connexion->cmd("$add_password\n");
    }
    print "[+] Disconnecting from server $server..\n";
    $connexion->close;
     
    #
    # Functions
    #
    sub FindServer {
      my $server = shift;
     
      unless ( defined $server ) {
        $server = PoseQuestion("On what server to connect ?");
      }
      return $server;
    }
     
    sub FindLogin {
      my $login = shift;
     
      unless ( defined $login ) {
        $login = PoseQuestion("With what you want to login to connect to server $server ?");
      }
      return $login;
    }
     
    sub FindPassword {
      my $login    = shift;
      my $password = read_password("Quel password souhaitez vous utiliser avec le compte $login ?  : ");
      return $password;
    }
     
    sub FindAccount {
      my $account = shift;
     
      unless ( defined $account ) {
        $account = PoseQuestion("What you want to create account on the server $server ?");
      }
      return $account;
    }
     
    sub FindUid {
      my $uid = shift;
     
      unless ( defined $uid ) {
        $uid = PoseQuestion("IUD ?");
      }
      return $uid;
    }
     
    sub PoseQuestion {
      my ($Question) = @_;
      print STDOUT "$Question : ";
      my $Reponse = <STDIN>;
      chomp $Reponse;
      print STDOUT "\n";
     
      return $Reponse;
    }
     
    #
    ###### End Of Script #####
    #
    Je t'ai mis la demande de password à la fin des autres, car j'ai l'impression qu'il fait switcher les appels suivant à STDIN.

    Je t'ai rajouté une procédure PoseQuestion qui améliore la lisibilité du code.

  5. #5
    Membre averti Avatar de Vespasien
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    383
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 383
    Points : 434
    Points
    434
    Par défaut
    Salut,

    C'est le seul script ou il est appelé par un autre? Je vois que seule $password est définie avec un my. En passant à blanc "" $uid et $account, tu y verrais plus clair.

  6. #6
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Bonjour djibril et merci. Le problème semble corrigé mais du coup ça modifie l'ordre des questions. On sait tous que les gens ne lisent pas, ça paraissait logique d'avoir le password tout de suite après le login ^^

    Je vais tester en insérant la fonction plus bas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $connexion->login( $login, FindPassword($login) );

    Bonjour Vespasien, ce script est autonome
    En fait les autres variables sont définies grâce à GetOptions

Discussions similaires

  1. une fonction qui ne s'execute pas correctement
    Par chmek firas dans le forum Débuter
    Réponses: 4
    Dernier message: 14/05/2012, 22h26
  2. Jquery fonction qui ne s'execute pas sous IE6 IE7
    Par boutmos dans le forum jQuery
    Réponses: 2
    Dernier message: 06/10/2009, 14h54
  3. Jquery fonction qui ne s'execute pas sous IE6 IE7
    Par boutmos dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 06/10/2009, 11h44
  4. Fonction qui ne s'execute pas
    Par RegiO dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 27/07/2006, 09h45
  5. fonction qui ne s'execute pas mais qui ne retourne pas d'erreur
    Par duplo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/06/2006, 21h43

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