

#!/bin/ksh
# Listing 1.
# genpass: This script creates a pseudo-random password.
# by randomly sampling arrays containing upper-case, lower-case,
# digits, and other characters.

LENGTH=$1
DEFAULT_LENGTH=8

upper_limit=0
for char in 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
do
   ((upper_limit = upper_limit + 1))
   upper_chars[$upper_limit]=$char
done

lower_limit=0
for char in 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
do
   ((lower_limit = lower_limit + 1))
   lower_chars[$lower_limit]=$char
done

digit_limit=0
for char in 0 1 2 3 4 5 6 7 8 9
do
   ((digit_limit = digit_limit + 1))
   digit_chars[$digit_limit]=$char
done

other_limit=0
# don't forget to escape the shell meta characters
for char in \~ ! @ \# $ % ^ \& \( \) _ + { } \| : \" \< \> ? - = [ ] \; , . /
do
   ((other_limit = other_limit + 1))
   other_chars[$other_limit]=$char
done

password=""
i=0

while (( $i < ${LENGTH:=$DEFAULT_LENGTH} ))
do
   s1=$(vmstat -s | cut -b1-9 | tr -d " \n")
   s2=$(/usr/bin/ps -elfy)
   s3=$(/usr/bin/cat -s /etc/shadow)

   RANDOM=$( echo $s1 $s2 $s3 | /usr/bin/cksum | /usr/bin/cut -b1-8)

   case $(( $RANDOM % 4 )) in
      0) next_char=${upper_chars[$(( $RANDOM % $upper_limit + 1 ))]} ;;
      1) next_char=${lower_chars[$(( $RANDOM % $lower_limit + 1 ))]} ;;
      2) next_char=${digit_chars[$(( $RANDOM % $digit_limit + 1 ))]} ;;
      3) next_char=${other_chars[$(( $RANDOM % $other_limit + 1 ))]} ;;
   esac

   password=${password}${next_char}

   (( i = i + 1 ))
done

/usr/bin/echo $password
# End Listing 1


