Clean up pw()

This commit is contained in:
Eryn Wells 2013-08-09 18:21:34 -07:00
parent e9901e62b7
commit 5882ad7d0a

View file

@ -1,20 +1,49 @@
#!/bin/zsh #!/bin/zsh
# vim:ft=zsh # vim:ft=zsh
local ALPHA_SET='A-Za-z' function _usage_pw
local NUMERIC_SET='0-9' {
local SYM_SET='!@#$%^&*' cat <<EOF
local XSYM_SET="${SYM_SET}.;:-+=" Usage: $1 [-c <num>] [-h] [-l <num>] [-s <set>]
local ALNUM_SET="${ALPHA_SET}${NUMERIC_SET}"
local ALL_SET="${ALNUM_SET}${SYM_SET}"
local XALL_SET="${ALNUM_SET}${XSYM_SET}"
local -i length=16 count=1 Password generator. Uses the system random data generator to produce passwords
local charset="$ALL_SET" of the provided length.
while getopts 'c:l:s:' opt; do Arguments:
-c Count. Number of passwords to generate. (default: 1)
-h Help. This message.
-l Length. Number of characters per password. (default: 16)
-s Character set. Set of characters from which each character of a
password is generated. (default: all)
alpha Uppercase and lowercase ASCII characters (A-Za-z)
num Numeric characters (0-9)
alnum The above two sets combined
sym Symbol set, including: ! @ # $ % ^ & *
xsym Extended symbols. Above plus . ; : - + =
all Alphanumeric and symbol sets above
xall Alphanumeric and extended symbol sets above
EOF
}
function pw
{
local ALPHA_SET='A-Za-z'
local NUMERIC_SET='0-9'
local SYM_SET='!@#$%^&*'
local XSYM_SET="${SYM_SET}.;:-+="
local ALNUM_SET="${ALPHA_SET}${NUMERIC_SET}"
local ALL_SET="${ALNUM_SET}${SYM_SET}"
local XALL_SET="${ALNUM_SET}${XSYM_SET}"
local -i length=16 count=1
local charset="$ALL_SET"
while getopts 'c:hl:s:' opt; do
case $opt in case $opt in
c) count=$OPTARG;; c) count=$OPTARG;;
h) _usage_pw $0; return 0;;
l) length=$OPTARG;; l) length=$OPTARG;;
s) case $OPTARG in s) case $OPTARG in
alpha) charset="$ALPHA_SET";; alpha) charset="$ALPHA_SET";;
@ -29,16 +58,19 @@ while getopts 'c:l:s:' opt; do
;; ;;
*) echo "Invalid argument: $opt" 1>&2; return -1;; *) echo "Invalid argument: $opt" 1>&2; return -1;;
esac esac
done done
local cmd='tr -dc "$charset" < /dev/urandom | fold -w $length | head -n $count' local cmd='tr -dc "$charset" < /dev/urandom | fold -w $length | head -n $count'
if [[ $SYS == 'darwin' ]]; then if [[ $SYS == 'darwin' ]]; then
# The way OS X >=10.6 handles unicode characters causes tr to fail with an # The way OS X >=10.6 handles unicode characters causes tr to fail with an
# 'Illegal byte sequence' error. Setting the locale here fixes that. # 'Illegal byte sequence' error. Setting the locale here fixes that.
# #
# See: http://nerdbynature.de/s9y/?176 # See: http://nerdbynature.de/s9y/?176
cmd="LC_CTYPE=C $cmd" cmd="LC_CTYPE=C $cmd"
fi fi
eval "$cmd" eval "$cmd"
}
pw $@