makepass

makepass
#!/bin/bash
 
# makepass:  Generates a password of custom length
# Requires:  'head' binary from coreutils
# Version:   0.1
# Build:     20-Nov-2010
# Author:    Heiko Barth
# Licence:   Beer-Ware (See: http://en.wikipedia.org/wiki/Beerware)
 
# Character classes
chars=$chars'abcdefghijkmnpqrstuvwxyz'	# lower case; 'l' 'o' removed
chars=$chars'ABCDEFGHJKLMNPQRSTUVWXYZ'	# upper case; 'I' 'O' removed
chars=$chars'123456789'			# digits; 0 removed
chars=$chars'!$%#'			# some special chars
 
# Some input validation
if [[ $1 =~ ^[0-9]+$ ]] && [ $1 -gt 0 ]; then length=$1
	# Check if custom characters are given
	if [ $# -eq 2 ] && [ ${#2} -gt 0 ]; then
		shift
		chars=$@
		echo "Using custom characters: $chars"
	fi
 
	tput sc
	echo -n "Progress: 0 of $length characters"
 
	# Get random characters
	while [ 1 ]; do
		c=$(head -c 1 /dev/urandom)
		if [[ $c =~ [$chars] ]]; then
			res=$res$c
			let i++
			tput el1; tput rc
			echo -n "Progress: $i of $length characters"
			if [ ${#res} -eq $length ]; then
				tput el1; tput rc
				echo -e "Password: $res\n"
				exit
			fi
		fi
	done
else
	echo "Syntax: makepass <length> [<characters>]" >&2
	echo
	exit 1
fi