Globenaut

Jeder hat das Recht auf Meinungsfreiheit und freie Meinungsäußerung; dieses Recht schließt die Freiheit ein, Meinungen ungehindert anzuhängen sowie über Medien jeder Art und ohne Rücksicht auf Grenzen Informationen und Gedankengut zu suchen, zu empfangen und zu verbreiten.
Die Allgemeine Erklärung der Menschenrechte
Resolution 217 A (III) vom 10.12.1948/Artikel 19
Zensoren sind Verbrecher!
BPjM: Trusted Censorship
Christliche Werte — Neine Danke!

Skripttipp #10: Passwortgenerator für MacOS X und Linux

von Globenaut am 8.8.09

Für alle die öfter mal ein neues Passwort benötigen lohnt sich ein kleiner Passwortgenerator für die Kommandozeile. Unter Linux reicht hierfür ein kurzer Einzeiler, unter MacOS X Leopard sind ein paar Zeilen mehr notwendig (zumindest bis zur aktuellen Version 10.5.8), weil ein merkwürdiger Fehler von MacOS X Leopard umgangen werden muß.

Linux

Zunächst der grundlegende Teil am Beispiel Linux. Als Erstes wird mit urandom ein (pseudo)zufälliger Zeichenstrom erzeugt, der mit tr auf sinnvolle Zeichen (hier: auf der Tastatur leicht eingebbar) eingegrenzt und mittels head auf die gewollte Länge gestutzt wird.

tr -dc "[:graph:]" < /dev/urandom | head -c10

Der auszugebene Zeichensatz läßt sich dabei wie folgt steuern:

  • [:alnum:] nur Buchstaben und Zahlen
  • [:alpha:] nur Buchstaben
  • [:digit:] nur Zahlen
  • [:graph:] nur durckbare Zeichen, außer Leerzeichen
  • [:lower:] nur Kleinbuchstaben
  • [:upper:] nur Großbuchstaben
  • [:xdigit:] nur hexadezimale Zeichen

Dies sind nur die für Passwörter sinnvollen Parameter. Wer Anderes benötigt, möge dies mit man tr nachlesen.

MacOS X

Benutzt man unter MacOS X Leopard den Einzeiler aus dem Linuxabschnitt, erhält man eine Fehlermeldung, die auf einen Fehler in Leopard zurückgeht:

#:~>tr -dc "[:graph:]" < /dev/urandom | head -c10
head: can't combine line and byte counts
tr: Illegal byte sequence

Diese Fehlermeldung taucht dann auf, wenn die LOCALE in LC_ALL einen anderen Wert als C hat (auf einem deuschen System ist dies mehrheitlich de_DE.UTF-8). Um diesen Fehler zu umgehen muß man also die Variable LC_ALL entsprechend anpassen und falls man in einem längeren Skript arbeitet nachher wieder auf den ursprünglichen Wert zurücksetzen:

#!/usr/bin/env bash
#
lc=$LC_ALL
LC_ALL=C
tr -dc "[:graph:]" < /dev/urandom | head -c10
LC_ALL=$lc

Dieses Skript liefert das gleiche Ergebnis wie der Einzeiler unter Linux, eine zehnstellige Zeichenfolge.

Gemischtes

Man kann dieses Skript aber noch aufhübschen. Ersetzt man head -c10 durch head -c ${1:-10} kann man die Passwortlänge einfach durch Übergabe eine Wertes steuern. Wird nichts übergeben, erfolgt standardmäßig eine zehnstellige Ausgabe. Eine weitere Verbesserung könnte sein, daß die Ausgabe gleich direkt in die Zwischenablage (vgl. Skripttipp #7: Datenaustausch zwischen Zwischenablage und Terminal) geschrieben wird. Dies ist praktisch, wenn man öfter Passwörter beim Surfen benötigt. Unter Linux erfolgt dies mit xclip, unter MacOS X mit pbcopy:

tr -dc "[:graph:]" < /dev/urandom | head -c ${1:-10} | xclip
tr -dc "[:graph:]" < /dev/urandom | head -c ${1:-10} | pbcopy

Zum Abschluss noch eine runde, komplette Lösung für MacOS X.

Für Macianer die gar nicht gerne mit dem Terminal arbeiten, gibt es die Möglichkeit den Passwortgenerator in die Menüleiste zu integrieren (vgl. Skripttipp #1: Bashskripte in die Menüzeile des Finders einbinden). Die einfachste Möglichkeit ist, ein Alias auf das Skript (oder auch das Skript selber) unter »~/Library/Scripts/« abzulegen. Bei dieser Variante können dem Skriptaufruf keine Parameter übergeben werden. Daher ist es besser, ein kleines AppleSkript zu schreiben, welches das Bashskript ggf. mit entsprechenden Parametern aufruft.
Eine Komplette Lösung, also Passwortgenerator in der Menüzeile und ein Alias in der .bashrc verweisen mit unterschiedlichen Parametern auf das Bashskript:

Das Skript
#!/usr/bin/env bash
#
# Dateiname     Passwortgenerator
# Autor         Globenaut
# erstellt      08.08.2009
# geändert      08.08.2009
# Beschreibung  Erzeugt pseudozufällige Zeichenfolgen für Passworte.
# Parameter     $1: Länge der Zeichenfolge 

pb=0
Zeichenvorrat='[:graph:]'
while getopts ':abcghkxz' Schalter
do
    case "$Schalter" in
        a ) Zeichenvorrat='[:alnum:]';;
        b ) Zeichenvorrat='[:alpha:]';;
        g ) Zeichenvorrat='[:upper:]';;
        k ) Zeichenvorrat='[:lower:]';;
        x ) Zeichenvorrat='[:xdigit:]';;
        z ) Zeichenvorrat='[:digit:]';;
        c ) pb=1;;
        \? ) echo 'Abbruch, da unbekannter Schalter: -'$OPTARG; exit;;
    esac
done
shift $((OPTIND - 1))

lc=$LC_ALL
LC_ALL=C
pw=`tr -dc "[:graph:]" < /dev/urandom | head -c ${1:-10}`
LC_ALL=$lc
if [ $pb == 1 ]; then
    echo -n $pw | pbcopy  
else
    echo $pw
fi  

exit 0
########## Weitere Erl?uterungen zum Skript ##########
# Schalter:
# -a Alphanumerische Zeichen [:alnum:].
# -b Nur Buchstaben [:alpha:].
# -c Wenn vorhanden wird die Zeichenfolge in die Zwischenablage geschrieben, ansonsten auf stdout ausgegeben.
# -g Nur Gro?buchstaben [:upper:].
# -h Ruft diese Hilfe auf.
# -k Nur Kleinbuchstaben '[:lower:].
# -x Nur hexadezimale Zeichen [:xdigit:].
# -z Nur Ziffern [:digit:].

Das AppleSkript
tell current application
 do shell script "~/bin/Passwortgenerator -c 10"
end tell

Der Pfad zum Skript muß ggf. angepasst werden und es muß in »~/Library/Scripts/« gespeichert werden. Jetzt steht der Passwortgenerator in allen Programmen in der Menüzeile zur Verfügung (sofern das Skriptmenü aktiviert ist, vgl. Skripttipp #1). Bei Anklicken der Menüzeile wird eine 10stellige pseudozufällige Zeichenfolge in die Zwischenablage geschrieben, gebrauchsfertig zum Einsetzen in Webformulare. Achtung: Die Zeichenfolge ggf. notieren, da Passwortfelder Selbige nicht anzeigen und sie nicht reproduzierbar ist!

Das Alias
alias pw='Passwortgenerator 20'

Bei Aufruf von pw im Terminal wird eine 20stellige Zeichenfolge auf der Kommandozeile ausgegeben.

Darüberhinaus hat man noch die Möglichkeit das Bashskript mit beliebigen Paramtern aufzurufen:

#:~>Passwortgenerator 35
#:~>S,/Eqzd)GDGHeSc%:]/#tQaUXr{&`~?rFgO
#:~>Passwortgenerator -c 40

Das Skript ist so eingestellt, daß nach der Zeichenfolge kein Umbruch ausgegeben wird, wenn sie in die Zwischenablage geschrieben wird (daher echo -n $pw), bei Ausgabe auf die Kommandozeile hingegen schon.

Labels: , , , , , , , , ,

#
Kommentare:
Kommentar veröffentlichen

Neuester Eintrag
Piratenblogger
Glauben ist die mutwillige Nichtbenutzung des Verstandes!
Bundestagswahl 2009: Weg mit dem Gesindel von SPD und C*U!
© 2005-2009, GlobenautDieses Blog wird unterstützt von Blogger.