Pad

This generates a list of passwords, as a pad, I carry a subset of one of these with me in case I need a truly random password while I’m out.

#!/bin/bash
#      SRJ 2016-09-20 Create reasonable passwords
#      0        1         2         3         4         5         6         7
#      1234567890123456789012345678901234567890123456789012345678901234567890123456789
Chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.!@#$%&-_=+abcdefghijklmnopqrstuvwxyz"
# The column labels are taken from the beginning of the $Chars string
Count=${#Chars}   # Length of $Chars
R="60"   # Number of rows in output, 60 works well
C="6"   # Number of columns in output, 6 is the way
L="12"  # Length of string, 12 is ideal
# Shouldn't need to change anything below here
 
if [ ! -z ${1} ] ; then R="${1}" ; fi
if [ ! -z ${2} ] ; then C="${2}" ; fi
if [ ! -z ${3} ] ; then L="${3}" ; fi
 
d=$((L/2)) ; ((d++)) # Half of L plus 1
Sep="-"   # The Seperator at the top of each column
Blanks="" # This line and next generate the empty space at the beginning of each line
for z in $(seq 1 ${#R}) ; do Blanks+=" " ; done
 
Ran()
{
Offset=$(($(head -c4 /dev/urandom | od -N2 -tu2 | sed -ne '1s/.* //p')%$Count))
echo "${Chars:${Offset}:1}"
};
 
# Generate the top two lines of the report, labeling the columns and adding
# a seperator line
for Row in $(seq -w 0 1)
do echo -n "${Blanks}| "
  for Column in $(seq -w 1 ${C})
  do for Place in $(seq -w 1 ${L})
    do if [ ${Row} = "1" ] ; then
      echo -n "${Sep}"
      else if [ ${Place} -eq ${d} ] ; then
        echo -n ${Chars:$((Column-1)):1}
        else echo -n " " ; fi ; fi
    done ; if [ ! ${Column} -eq ${C} ] ; then echo -n " " ; fi
  done ; echo ""
done
 
# Send out the rows and columns of random characters
for Row in $(seq -w 1 ${R})
do echo -n "${Row}| "
  for Column in $(seq -w 1 ${C})
  do for Place in $(seq -w 1 ${L})
    do echo -n "$(Ran)"
    done ; if [ ! ${Column} -eq ${C} ] ; then echo -n " " ; fi
  done ; echo ""
done