Go4Expert

Go4Expert (http://www.go4expert.com/)
-   Perl (http://www.go4expert.com/articles/perl-tutorials/)
-   -   PERL password generator for Linux (genpass) (http://www.go4expert.com/articles/perl-password-generator-linux-genpass-t4804/)

munkyeetr 22Jun2007 06:04

PERL password generator for Linux (genpass)
 
This is a password generator script that I have written. Any feedback, critique or suggestions would be much appreciated.

Code: perl

#!/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__


pradeep 22Jun2007 09:40

Re: PERL password generator for Linux (genpass)
 
Really cool one!

munkyeetr 22Jun2007 17:56

Re: PERL password generator for Linux (genpass)
 
thanks

kush_2207 28Jun2007 22:11

Re: PERL password generator for Linux (genpass)
 
password generator ? concise explaination will suffice. Thanks

pradeep 28Jun2007 23:32

Re: PERL password generator for Linux (genpass)
 
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??

kush_2207 28Jun2007 23:36

Re: PERL password generator for Linux (genpass)
 
ok dude...got it.

vile 12May2011 23:15

Re: PERL password generator for Linux (genpass)
 
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;
 }



All times are GMT +5.5. The time now is 14:13.