#!/usr/bin/perl use strict; use warnings; use Getopt::Std; sub show_help {
print "Useage:\n" ; print "newp -aAnsl\n" ; print "-a\t\t the password contains lower case letters(a-z)\n" ; print "-A\t\t the password contains upper case letters(A-Z)\n" ; print "-n\t\t the password contains numerical character(0-9)\n" ; print "-s\t\t the password contains special symbols\n" ; print "-u\t\t the password contains only unique characters\n" ; print "-l length\t set the password length(default: 6)\n" ; exit 0; } sub show_version {
print "Version: 0.2.1 Changed the default option: -l 9 -Ana. 2016-4-15\n" ; exit 0; } ### main program use vars qw( $opt_a $opt_A $opt_h $opt_l $opt_n $opt_s $opt_u $opt_v ); getopts( 'aAhl:nsuv' ); &show_version if $opt_v ; &show_help if $opt_h ; my $len = $opt_l || 9; # default length 9 my $opt_cnt = 0; my @rand_str = (); # store all the characters my @num = qw(0 1 2 3 4 5 6 7 8 9); my @ABC = qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z); my @abc = qw(a b c d e f g h i j k l m n o p q r s t u v w x y z); # my @sym = qw(! " $ % & ' * + - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~); my @sym = qw(! $ % & * + - . / : ; < = > ? @ [ ] ^ _ ` { | } ~); # no " ' \ unshift ( @sym , '(' , ')' , '#' , ',' ); # to prevent perl's complains or warnings. my @all_sym = ( @num , @ABC , @abc , @sym ); my @ch_src = (); if ((! $opt_a ) && (! $opt_A ) && (! $opt_n ) && (! $opt_s )) {
$opt_a ++; $opt_A ++; $opt_n ++; } if ( $opt_a ) {
$opt_cnt ++; my $i = rand @abc ; unshift @rand_str , $abc [ $i ]; if ( $opt_u ) {
if ( $i >=1) {
$abc [ $i -1] = shift @abc ; } else {
shift @abc ; } } unshift ( @ch_src , @abc ); } if ( $opt_A ) {
$opt_cnt ++; my $i = rand @ABC ; unshift @rand_str , $ABC [ $i ]; if ( $opt_u ) {
if ( $i >=1) {
$ABC [ $i -1] = shift @ABC ; } else {
shift @ABC ; } } unshift ( @ch_src , @ABC ); } if ( $opt_n ) {
$opt_cnt ++; my $i = rand @num ; unshift @rand_str , $num [ $i ]; if ( $opt_u ) {
if ( $i >=1) {
$num [ $i -1] = shift @num ; } else {
shift @num ; } } unshift ( @ch_src , @num ); } if ( $opt_s ) {
$opt_cnt ++; my $i = rand @sym ; unshift @rand_str , $sym [ $i ]; if ( $opt_u ) {
if ( $i >=1) {
$sym [ $i -1] = shift @sym ; } else {
shift @sym ; } } unshift ( @ch_src , @sym ); } if ( $len < $opt_cnt ) {
print "The count of characters[$len] should not be smaller " . "than count of character types[$opt_cnt].\n" ; exit -1; } if ( $opt_u && $len > ( @ch_src + @rand_str )) {
print "The total number of characters[" .( @ch_src + @rand_str ). "] which could be contained " . "in password is smaller than the length[$len] of it.\n" ; exit -1; } foreach (1.. $len - $opt_cnt ) {
my $i = rand @ch_src ; unshift @rand_str , $ch_src [ $i ]; if ( $opt_u ) {
if ( $i >=1) {
$ch_src [ $i -1] = shift @ch_src ; } else {
shift @ch_src ; } } } foreach (1.. $len ) {
my $i = rand @rand_str ; print $rand_str [ $i ]; if ( $i >=1) {
$rand_str [ $i -1] = shift @rand_str ; } else {
shift @rand_str ; } } print "\n" ; exit 0; |