-
-
Save grugq/d2383ee4ff5ee0b085e8f5612fe3cb73 to your computer and use it in GitHub Desktop.
passphrase generator using cmdline tools because wtf not
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# simplistic program that creates passphrases using bash. the passphrases | |
# are a Number of '-' separated words, ea. of max Chars, with limited post | |
# processing (upper case, lower case, 1337.) | |
# | |
# (c) 2019, thaddeus t. grugq <[email protected]> | |
# | |
CRACKLIB=/usr/share/dict/cracklib-small | |
DICT=/usr/share/dict/words | |
lower() { | |
echo $1 | tr A-Z a-z | |
} | |
upper() { | |
echo $1 | tr a-z A-Z | |
} | |
l33t() { | |
echo "$1" | tr 'iletas' '1137@$' | |
} | |
qstrip() { | |
echo "$1" | sed -e "s/'//g" -e 's/"//g' | |
} | |
random_word() { | |
local n="$1" | |
local munge="${2:-l}" # l u e | |
local fname="$DICT" | |
local total=$( sed -E -n "/^.{1,$n}$/p" $fname | wc -l | awk '{ print $1 }') | |
while true | |
do | |
ndx=$RANDOM | |
if [[ "$total" -lt "$ndx" ]]; then | |
ndx=$(( $ndx % $total )) | |
fi | |
word=$(sed -E -n "/^.{1,$n}$/p" $fname | sed -n "${ndx}p") | |
case $munge in | |
"l"|"L") | |
word=$(lower "$word") | |
;; | |
"u"|"U") | |
word=$(upper "$word") | |
;; | |
"e"|"3") | |
word=$(l33t "$word") | |
word=$(lower "$word") | |
;; | |
*) | |
word=$(lower "$word") | |
;; | |
esac | |
break | |
done | |
echo "$(qstrip $word)" | |
} | |
gen_passphrase() { | |
local num="${1:-3}" | |
local len=${2:-5} | |
local sep="${3:--}" | |
local munge="${4:-l}" | |
words="" | |
for i in $(seq $num) | |
do | |
word=$(random_word $len $munge) | |
if [[ $i -eq 1 ]]; then | |
words="$word" | |
else | |
words="${words}${sep}$word" | |
fi | |
done | |
echo $words | |
} | |
usage() { | |
echo "ppw [-c|--chars N] [-n|--number N] [-l|--lower,-u|--upper,-e|--elite]" | |
echo " [-s|--sep C] [-k|--krack]" | |
echo "" | |
echo " -c,--chars max chars per word, default: 6" | |
echo " -n,--number number of words, default: 4" | |
echo " -l,--lower convert to lowercase {default}" | |
echo " -u,--upper convert to uppercase" | |
echo " -e,--elite convert to 1337" | |
echo " -s,--sep separator char, default: -" | |
echo " -k,--krack use cracklib, default /usr/share/dict/words" | |
echo "" | |
echo "example: " | |
echo " ppw -c 8 -n 4 -u -s @" | |
echo " JUNE@PIKE@PEABODY@FIORDS" | |
echo "" | |
echo " ppw -c 9 -n 8 " | |
echo " susanna-duncan-henrys-goethe-izaaks-abrams-degeneres-murdochs" | |
echo "" | |
echo " ppw -c 9 -n 5 -k " | |
echo " serviette-salver-notches-catchy-sheppard" | |
} | |
TEMP=$(getopt -o 'c:n:lues:kh' --long 'chars:,number:,lower,upper,elite,sep:,krack,help' -n 'ppw' -- "$@") | |
if [ $? -ne 0 ]; then | |
echo 'Terminating...' >&2 | |
exit 1 | |
fi | |
# | |
eval set -- "$TEMP" | |
unset TEMP | |
while true | |
do | |
case "$1" in | |
'-c'|'--chars') | |
chars=$2 | |
shift 2 | |
continue | |
;; | |
'-n'|'--number') | |
number=$2 | |
shift 2 | |
continue | |
;; | |
'-l'|'--lower') | |
munge="l" | |
shift | |
continue | |
;; | |
'-u'|'--upper') | |
munge="u" | |
shift | |
continue | |
;; | |
'-e'|'--elite') | |
munge="e" | |
shift | |
continue | |
;; | |
'-s'|'--sep') | |
sep=$2 | |
shift 2 | |
continue | |
;; | |
'-k'|'--krack') | |
DICT=$CRACKLIB | |
shift | |
continue | |
;; | |
'-h'|'--help') | |
usage | |
exit 1 | |
continue | |
;; | |
'--') | |
shift | |
break | |
;; | |
*) | |
echo 'Internal error!' >&2 | |
exit 1 | |
;; | |
esac | |
done | |
chars=${chars:-6} | |
number=${number:-4} | |
munge=${munge:-l} | |
sep=${sep:--} | |
gen_passphrase "$number" "$chars" "$sep" "$munge" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment