Blob


1 #!/bin/sh
2 #
3 # Copyright (c) 2022 Omar Polo <op@omarpolo.com>
4 #
5 # Permission to use, copy, modify, and distribute this software for any
6 # purpose with or without fee is hereby granted, provided that the above
7 # copyright notice and this permission notice appear in all copies.
8 #
9 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 me=$(basename "$0")
19 usage() {
20 echo "usage: $me [-an] [-w wordlist] [len]" >&2
21 exit 1
22 }
24 wordlist=
25 chars="[:print:]"
26 len=32
28 while getopts anw: ch; do
29 case $ch in
30 a) chars="[:alnum:]" ;;
31 n) chars="[:digit:]" ;;
32 w) wordlist="$OPTARG"; len=6 ;;
33 ?) usage ;;
34 esac
35 done
36 shift $(($OPTIND - 1))
38 [ $# -gt 1 ] && usage
39 [ $# -eq 1 ] && len="$1"
41 if [ -n "$wordlist" ]; then
42 passphrase=$(sort -R "$wordlist" | head -n "$len")
43 [ -n "$passphrase" ] && echo $passphrase
44 else
45 export LC_ALL=C
46 tr -cd "$chars" </dev/urandom | dd bs=1 count="$len" 2>/dev/null && \
47 echo
48 fi