PERL password generator for Linux (genpass)

Discussion in 'Perl' started by munkyeetr, Jun 22, 2007.

  1. munkyeetr

    munkyeetr New Member

    Joined:
    May 4, 2007
    Messages:
    40
    Likes Received:
    0
    Trophy Points:
    0
    Location:
    Victoria BC, Canada
    This is a password generator script that I have written. Any feedback, critique or suggestions would be much appreciated.

    Code:
     #!/usr/bin/perl
     
     ## ***************************************************************************
     #
     #  genpass v1.0 (06.2007) Password Generation Program
     #  Copyright (C) 2007 Jon Brown
     #
     #  This program is free software; you can redistribute it and/or modify
     #  it under the terms of the GNU General Public License as published by
     #  the Free Software Foundation; either version 2 of the License, or
     #  (at your option) any later version.
     #
     #  To read the full text go to [url="http://www.gnu.org/licenses/gpl.txt"]http://www.gnu.org/licenses/gpl.txt[/url]
     #
     #  This program is distributed in the hope that it will be useful,
     #  but WITHOUT ANY WARRANTY; without even the implied warranty of
     #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     #  GNU General Public License for more details.
     #
     #  You should have received a copy of the GNU General Public License
     #  along with this program; if not, write to the Free Software
     #  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     #
     ## ***************************************************************************
     
     use strict;
     use warnings;
     use Getopt::Long;
     Getopt::Long::Configure ("bundling");
     
     ## PARSE AND SET COMMAND-LINE OPTIONS
     ## -----------------------------------------------------
     my %flags=('symbols', 0, 'numbers', 0, 'uppercase', 0, 'lowercase', 0, 'confusable', 0, 'help', 0, 'qty', 1, 'version', 0);
     
     GetOptions( 's|S|symbols' => \$flags{symbols},
             'n|N|numbers' => \$flags{numbers},
             'u|U|uppercase' => \$flags{uppercase},
             'l|L|lowercase' => \$flags{lowercase},
             'c|C|confusable' => \$flags{confusable},
             'q|Q:i' => \$flags{qty},
             'help' => \$flags{help},
             'ver|version' => \$flags{version} );
     
     # Set password characters, excluding those flagged on the command-line
     my $pwdchars = join( '', map {chr} ( 0x21 .. 0x7e ));
         $pwdchars =~ s/\d+//    if ( $flags{numbers} );
         $pwdchars =~ s/[A-Z]+// if ( $flags{uppercase} );
         $pwdchars =~ s/[a-z]+// if ( $flags{lowercase} );
         $pwdchars =~ s/[_\W]+//g if ( $flags{symbols} );
         $pwdchars =~ tr/1Il0O//d  if ( $flags{confusable} );
     
     # If user triggered the --help option flag, display and exit
     if ($flags{help}) {            
         &DisplayUsage();    
         exit();
     }
     elsif ($flags{version}) {
         &DisplayVersion();
         exit();
     }
     
     ## START VALIDATE INPUT
     ## -----------------------------------------------------
     my $kill=0;        # flag to stop the script if input is invalid (or --help is used)
     my @errmsg;        # error message descriptions
     
     # If -q option was used to set a quantity of passwords, make sure it contains at
     # least a value of 1 so that a password can be generated
     if ($flags{qty} == 0 || $flags{qty} < 0) {
         $flags{qty}=1;
     }
     
     # Check that user hasn't excluded all character-types, warn user, kill script
     if ( length($pwdchars) == 0) {
         push @errmsg, "** 0x1: At least 1 character-type must be included";    
         $kill=1;
     }
     
     # Check that user has passed only 1 argument (LENGTH) other than options flags, warn user, kill script
     if ($#ARGV > 0 || $#ARGV < 0) {
         push @errmsg, "** 0x2: Incorrect number of arguments passed";
         $kill=1;
     }
     
     # Check for only numeric input in LENGTH argument, warn user, kill script
     if ($ARGV[0] !~ /^[0-9]+$/) {
             push @errmsg, "** 0x3: Invalid input. LENGTH argument must be a numeric value";
             $kill=1;
     }
     
     # If any of the above validation tests triggered the $kill flag...
     if ($kill == 1) {                     
         print "\n** GENPASS ERROR ---------------------------------------------------------";
         print "\n** ".@errmsg." Error(s) found";      # display number of errors    
         foreach my $err (@errmsg) {             # display error messages
             print "\n".$err;
         }
         print "\n**\n** Type genpass --help for command usage\n";
         print "** -----------------------------------------------------------------------\n\n";
         exit();                         # exit script
     }
     ## END VALIDATE INPUT
     
     ## START MAIN SCRIPT
     ## -----------------------------------------------------
     # From 1 to qty
     
     for ( 1..$flags{qty} ) {
         print &GenPass( $ARGV[0] )."\n";
     }
     exit();
     
     ## END MAIN SCRIPT
     
     ## FUNCTION DEFINITIONS
     ## -----------------------------------------------------
     sub GenPass() {
         my ($pwdlen) = @_;
         my $limit = length( $pwdchars );
         my $pwd = '';
         
         for ( 0..$pwdlen-1 ) {
                 $pwd .= substr( $pwdchars, rand( $limit ), 1 );
         }
     
         return $pwd;
     }
     
     # use Here-Documents to display usage text
     sub DisplayUsage {
         print <<"USAGE";
     
       Usage: genpass [-snulcqX] LENGTH
       Generate secure passwords LENGTH characters long.
         
         -s, --symbols\tExclude symbols.
         -n, --numbers\tExclude numbers.
         -u, --uppercase\tExclude uppercase letters.
         -l, --lowercase\tExclude lowercase letters.
     
         -c, --confusable\tExclude confusable characters like: l,I,1,0,O
             
         -qX\t\t\tCreate X number of passwords.
             
         --help\t\tDisplay Usage information.
         --ver, --version\tDisplay version and license information.
             
       Report bugs, comments, and questions to jbrown_home\@yahoo.ca
         
     USAGE
     }
     
     # use Here-Documents to display version text
     sub DisplayVersion {
     print <<"VER";
       genpass v1.0 (06.2007) Copyright 2007 Jon Brown
     
       This is free software.  You may redistribute copies of it under the terms of
       the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
       There is NO WARRANTY, to the extent permitted by law.
     
       Written by Jon Scott Brown
     VER
     }
     __END__
     
      
     
  2. pradeep

    pradeep Team Leader

    Joined:
    Apr 4, 2005
    Messages:
    1,645
    Likes Received:
    87
    Trophy Points:
    0
    Occupation:
    Programmer
    Location:
    Kolkata, India
    Home Page:
    http://blog.pradeep.net.in
    Really cool one!
     
  3. munkyeetr

    munkyeetr New Member

    Joined:
    May 4, 2007
    Messages:
    40
    Likes Received:
    0
    Trophy Points:
    0
    Location:
    Victoria BC, Canada
  4. kush_2207

    kush_2207 New Member

    Joined:
    Jun 26, 2007
    Messages:
    49
    Likes Received:
    1
    Trophy Points:
    0
    password generator ? concise explaination will suffice. Thanks
     
  5. pradeep

    pradeep Team Leader

    Joined:
    Apr 4, 2005
    Messages:
    1,645
    Likes Received:
    87
    Trophy Points:
    0
    Occupation:
    Programmer
    Location:
    Kolkata, India
    Home Page:
    http://blog.pradeep.net.in
    Haven't you ever signed up at some website where they mail you a temporary password?? If yes, do you think some guy was sitting behind a terminal a generating that password for you??
     
  6. kush_2207

    kush_2207 New Member

    Joined:
    Jun 26, 2007
    Messages:
    49
    Likes Received:
    1
    Trophy Points:
    0
    ok dude...got it.
     
  7. vile

    vile New Member

    Joined:
    May 12, 2011
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    I added this bit immediately before the ARGV[0] length checking. This makes it simpler to just call the script by itself.

    Code:
    # Assume 10 character length is no argument is given
     unless (defined($ARGV[0])) {
        $ARGV[0] = 10;
     }
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice