makepasswd also looks useful. It's clumsier to use, but more flexible. You use the -c
option followed by a string to specify the exact set of allowed characters. The following
prints all of the 94 non-space printable characters:
for (( c=33; c<=126; c++ )); do printf "\x$(printf %x $c)"; done
which you can use to construct a makepasswd command using all of those characters (putting
all the special chars at the end, and backquoting each of them)
makepasswd -c
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~
-l 30
(for a 30-character password) and you can remove special chars depending on what a
particular website allows.