--- /dev/null
+#!/bin/bash
+#
+# Copyright (C) 2008-2010, William Trevor King <wking@drexel.edu>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# generate a random password, defaults to 8 characters
+#
+# usage: passwd-gen [num-characters]
+
+# You may want to modify NC to get the best performance depending on
+# your usual choice of DEVICE and N. For slower DEVICEs, it's better
+# to have lower NC (wastes less usable characters). For faster
+# DEVICEs, it's better to have a higher NC (fewer slow shell loops).
+
+N=8 # password length
+NC=4 # number of characters in a "chunk"
+#SET="[:alnum:][:punct:]" # set of allowed characters (see tr(1))
+SET="[:alnum:]"
+DEVICE=/dev/random # use /dev/urandom for faster, weaker passwords
+
+if [ -n "$1" ]
+then
+ N="$1"
+fi
+
+NA=0
+PWD=""
+while [ "$N" -gt 0 ]; do
+ ALL=$(head -c "$NC" "$DEVICE")
+ let "NA = NA + ${#ALL}"
+ NEW=$(echo "$ALL" | tr -d -c $SET | head -c "$N")
+ PWD="$PWD$NEW"
+ let "N = N - ${#NEW}"
+done
+
+echo "$PWD"
+echo "Length of password: ${#PWD}"
+echo "Total bytes read: $NA"
+
+exit 0