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: , , , , , , , , ,

#  0 Kommentare

Skripttipp #7: Datenaustausch zwischen Zwischenablage und Terminal

von Globenaut am 21.7.09

Der erste Teil beschreibt das Verfahren für MacOS X, weiter unten folgen dann Hinweise für Linux.

Besonders hilfreich sind die nachfolgend beschriebenen Funktionen beim Schreiben von Dokumentationen (bspw. Verzeichnislisten, Dateiinhalte) zur Weiterverabritung von Suchergebnissen oder auch mal zur Übertragung eines längeren Passwortes ohne Intermediärdatei.

MacOS X

Mac-Benutzer sind es seit den Anfängen gewohnt mittels Einfügen und Einsetzen Daten über die Zwischenablage zwischen Programmen auszutauschen. Seit MacOS X hat auch das klassische UNIX-Terminal Einzug gehalten, mit dem auch dann und wann Daten von Programmen der grafischen Oberfläche ausgetauscht werden sollen. Die beiden klassischen Wege über Kopieren und Einsetzten bzw. Drag & Drop funktionieren wie gewohnt, aber es gibt noch eine dritte Möglichkeit, die mehr Funktionalität bietet und oft auch schneller ist. Daher heute ein paar Tipps zu einem meinem Eindruck nach wenig bekannten, aber äußerst nützlichen Befehlspaar unter MacOS X: pbpaste und pbcopy.[1] Sie sind Bestandteil von MacOS X, daher ist keinerlei Installation notwendig. Mittels dieser beiden Terminalprogramme kann man Daten vom Terminal direkt in die Zwischenablage (pbcopy) bzw. aus der Zwischenablage (pbpaste) in das Terminal — genauer nach stdin — schreiben:

#:~>cat Test.txt | pbcopy
#:~>

Alternativ läßt sich auch mit der Ausgabeumleitung arbeiten:

#:~>pbcopy < Test.txt
#:~>

Eine Kopie des Inhaltes der Datei Test.txt befindet sich jetzt in der Zwischenablage. Dies ist deutlich schneller als das Aktivieren der Ausgabe im Terminalfenster oder das Anlegen einer temporären Datei und Öffnen dieser im Programm der grafischen Oberfläche (sofern sich dort überhaupt eine Textdatei öffnen läßt). Dies funktioniert natürlich auch mit jedem anderem Terminalprogramm oder Skript, welches eine Ausgabe auf stdout liefert:

#:~>ls -Ghl | pbcopy
#:~>grep blabla Test.txt | pbcopy
#:~>Mein_Skript.sh | pbcopy
#:~>

Pbcopy bietet die wohl schnellste Möglichkeit die Ergebnisse von Terminalprogrammen in die grafische Oberfläche zu bekommen. Allerdings kann ein Fallstrick entstehen, wenn man fälschlicherweise anstelle der Pipeline (|), die Ausgabeumleitung (>) benutzt:

#:~>Mein_Skript.sh > pbcopy
#:~>

Das funktioniert zwar fehlerfrei, führt nicht zum gewünschten Ergebnis. Alle Ausgaben von Mein_Skript.sh werden durch die Ausgabeumleitung in eine neu angelegte Textdatei namens pbcopy geschrieben. Das Programm pbcopy wird weder ausgeführt, noch muss es überhaupt vorhanden sein! Ein einfaches ls im Terminal zeigt es.

Richtig interessant wird pbcopy aber erst im Netzwerk, denn es kann zum schnellen Datentransfer zwischen zwei Rechnern benutzt werden. Angenommen man möchte den Inhalt einer Textdatei von einem entfernten Rechner in die Zwischenablage des eigenen Rechners holen:

#:~>ssh User@Entfernter_Rechner "cat Test.txt" | pbcopy
User@Entfernter_Rechner password:
#:~>

Die Datei Test.txt wird auf dem entfernten Rechner ausgelesen, über das Netzwerk nach stdout auf dem eigenen Rechner transferiert und über die Pipeline direkt in die Zwischenablage geschrieben.

Das eigentlich bemerkenswerte an dieser Befehlsfolge ist aber, daß auf dem entfernten Rechner weder MacOS X, noch pbcopy vorhanden sein müssen! Es funktioniert mit jedem Rechner, sofern man sich dort mittels SSH einloggen kann. Etwas anders sieht der Fall aus, wenn man sich erst auf dem entfernten Rechner eingeloggt hat und dann versucht mit pbcopy zu arbeiten:

#:~>ssh User@Entfernter_Rechner
User@Entfernter_Rechner password:
User@Entfernter_Rechner:~>cat Test.txt | pbcopy
#:~>

In diesem Falle arbeitet man mit stdin und stdout auf dem entfernten Rechner, d.h. es wird pbcopy auf dem entfernten Rechner und somit i.d.R. MacOS X benötigt. Außerdem würde diese Befehlsfolge den Inhalt der Datei in Zwischenablage des entfernten Rechners schreiben (was unter bestimmten Bedingungen auch durchaus sinnvoll sein kann) und nicht über das Netzwerk auf den eigenen Rechner transferieren.

Ein weiteres Anwendungsgebiet von pbcopy und pbpaste kann in Kombination mit dem do shell-Befehl von AppleSkript liegen, auch wenn AppleSkript einen eigenen Befehl zum Zugriff auf die Zwischenablage (the clipboard) bietet.

Linux

Unter Linux und in X11-Umgebungen leisten xsel und xclip analoge Funktionalität. Ubuntu-Benutzer müssen xclip und xsel noch nachinstallieren, was auf der Kommandozeile mit einem einfachen sudo apt-get install xclip bzw. sudo apt-get install xsel gemacht wird. Der Ablauf sollte ungefähr wie folgt aussehen:

#:~>sudo apt-get install xclip
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut       
Lese Status-Informationen ein... Fertig
Die folgenden NEUEN Pakete werden installiert:
  xclip
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 117 nicht aktualisiert.
Es müssen 16,6kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 77,8kB Plattenplatz zusätzlich benutzt.
Hole:1 http://de.archive.ubuntu.com jaunty/universe xclip 0.08-8 [16,6kB]
Es wurden 16,6kB in 4s geholt (3403B/s)
Wähle vormals abgewähltes Paket xclip.
(Lese Datenbank ... 104291 Dateien und Verzeichnisse sind derzeit installiert.)
Entpacke xclip (aus .../archives/xclip_0.08-8_i386.deb) ...
Verarbeite Trigger für man-db ...
Richte xclip ein (0.08-8) ...
#:~>apt-get install xsel
[sudo] password for Globenaut:
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut       
Lese Status-Informationen ein... Fertig
Die folgenden NEUEN Pakete werden installiert:
  xsel
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 117 nicht aktualisiert.
Es müssen 19,2kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 86,0kB Plattenplatz zusätzlich benutzt.
Hole:1 http://de.archive.ubuntu.com jaunty/universe xsel 1.2.0-1 [19,2kB]
Es wurden 19,2kB in 0s geholt (39,3kB/s)
Wähle vormals abgewähltes Paket xsel.
(Lese Datenbank ... 104284 Dateien und Verzeichnisse sind derzeit installiert.)
Entpacke xsel (aus .../archives/xsel_1.2.0-1_i386.deb) ...
Verarbeite Trigger für man-db ...
Richte xsel ein (1.2.0-1) ...
#:~>

Wie fast immer unter Linux erhält man mit xclip -h oder man xclip Informationen zur Benutzung von xclip und analog für xsel.
Für das Schreiben der Daten in die Zwischenablage gibt es, wie meistens, mehrere Wege:

#:~>xclip Test.txt
#:~>
#:~>cat Test.txt | xclip
#:~>

Von der Zwischenablage ins Terminal kann man es so machen:

#:~>xclip -o
#:~>Ich bin Text aus der Zwischenablage von Ubuntu.

Wie schon im Abschnitt von MacOS X, kann man eine Datei direkt übers Netzwerk in die Zwischenablage einlesen, ohne daß auf dem entfernten Rechner die Terminalprogramme vorhanden sein müssen. Eine ssh-Verbindung reicht aus:

#:~>ssh User@Entfernter_Rechner "cat Test.txt" | xclip
User@Entfernter_Rechner password:
#:~>

Da UNIX im Grunde meherere Zwischenablagen [2] kennt, kann man diese auch gezielt ansprechen, wenn es notwendig sein sollte. Meist reicht aber die Voreinstellung aus.

#:~>ssh User@Entfernter_Rechner "cat Test.txt" | xclip -selection clipboard -i
User@Entfernter_Rechner password:
#:~>

Wer in diesem Falle öfter Daten vom Terminal in die Zwichenablage übertragen muß, sollte sich ein alias in der .bashrc anlegen, damit alles was an xclip geleitet wird, automatisch in der Zwischenablage landet:

alias xclip -selection clipboard

  1. http://developer.apple.com/DOCUMENTATION/Darwin/Reference/ManPages/man1/pbcopy.1.html
  2. http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt

Labels: , , , , , , , , , , , ,

#  0 Kommentare

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.