Verschiedenes
Shell Zen
zen.bash ist ein kleines Skript zur Entspannung. Wesentlicher Teil des Skripts ist eine Schleife:
Ablauf: so lange die Variable count kleiner als die Variable maxcount ist, wird die Schleife durchlaufen. Am Ende der Schleife wird der Wert der Variablen count um 1 vergrößert.
Bash Script Template
Die Datei template.bash enthält einen einfachen Rahmen zur Erstellung von Bash Skripten mit Optionen und Argumenten.
Variablen
- SCRIPT_NAME
Diese Variable enthält den Namen des Skripts - SCRIPT_DIR
Diese Variable enthält den vollen Pfadnamen des Verzeichnisses, in dem das Skript abgelegt ist. - VERSION
Diese Variable enthält eine Versionsinformation zum Skript.
Weiter Variablen Diese Variaben sind nur Beispiele, die zeigen sollen, wie man Variablen über Optionen setzen kann.
- number
Ein Beispiel für eine numerische Variable - string
Ein Beispiel für eine String Variable
Optionen
-h oder --help : Ausgabe der Hilfeinformation und beenden des Skripts
-V oder --version : Ausgabe der Version und beenden des Skripts
-n oder --number : setzen der Variablen number
-s oder --string : setzen der Variablen string
-- : es wird nicht weiter auf Optionen geprüft
sinnvoll, wenn das erste Argument mit - oder --
beginnt.
Argumente
Das Skript erwartet ein Argument. Der Wert wird in der Variablen arg1 abgelegt.
Funktion print_usage
Gibt den Hilfetext aus
Passwort prüfen
Basierend auf dem heise Artikel Nach dem Passwort-Leak: Eigene Passwörter lokal checken habe ich mir das Skript checkPassword.bash geschrieben.
Das Skript prüft, ob das angegebene Passwort in der Pwned Passwords Datenbank enthalten ist. Man kann das Passwort auch auf der Site angeben, aber es wird dann auch an die Site übertragen.
Beispiel für eine Abfrage der Daten
Wie man diese Datenbank nutzen kann, ohne das Passwort an die Site zu übertragen, ist im heise Artikel beschrieben. Im folgenden Beispiel wird das Passwort 123456 benutzt.
Zuerst bildet man den SHA1 (Secure Hash Algorithm 1) Wert des Pasworts:
Warum wird echo mit -n aufgerufen?D.h.: man erhält einen anderen Hashwert.
$ echo -n "123456" | xxd
00000000: 3132 3334 3536 123456
$ echo "123456" | xxd
00000000: 3132 3334 3536 0a 123456.
Der Aufruf echo hängt an das Ende der Zeichenkette noch das Steuerzeichen 0x0a an, das für einen Zeilenvorschub sorgt. Da aber nur die Zeichenkette selbst gehasht werden soll, muss man echo mit der Option -n aufrufen.
Am Ende der Ausgabe des Hashwerts steht nach dem Hashwert noch " -". Diesen Teil kann man folgendermaßen entfernen:
Das awk Kommando bewirkt, dass von jeder gelesen Zeile (hier nur eine Zeile) das erste Wort ausgegeben wird.
Soweit so gut, aber: der Suchstring für die Abfrage muss Großuchstaben statt Kleinbuchstaben enthalten.
$ echo -n "123456" | sha1sum | awk '{ print $1; }' | tr '[a-z]' '[A-Z]'
7C4A8D09CA3762AF61E59520943DC26494F8941B
Man kann hier auch das folgende verwenden:
$ echo -n "123456" | sha1sum | awk '{ print $1; }' | tr '[:lower:]' '[:upper:]'
7C4A8D09CA3762AF61E59520943DC26494F8941B
Für die Suche werden nur die ersten 5 Zeichen ("7C4A8") gesendet. Dazu ruft man mit einem HTTP Get Request die folgende URL auf:
https://api.pwnedpasswords.com/range/7C4A8
Als Ergebnis erhält man eine Liste von Hashwerten (ohne die ersten 5 Zeichen) und die Anzahl der Treffer in der Datenbank. Die Zeilen haben dabei das folgende Format:
Für das Passwort 123456 sieht die Zeile folgendermaßen aus:
Die benötigten Wert kann man sich in der Bash folgendermaßen in Variablen speichern:
hash=`echo -n ${password} | sha1sum | awk '{ print $1; }' | tr '[a-z]' '[A-Z]'`
#
# benutze die ersten 5 Zeichen für die Suche
lookup=${hash:0:5}
#
# benutze den Rest als Suchstring in der erhaltenen Liste
rest=${hash:5}
Der HTTP Get Request kann in der Shell folgendermaßen erzeugt werden:
Hier die Bedeutung der verwendeten curl Optionen:
--tlsv1.3 : verwende das TLS 1.3 Protokoll
--silent : curl soll keine unnötigen Ausgaben machen
-o dateiname : schreibe die Antwort vom GET Request ind die Datei dateiname
Die erhaltenen Daten werden in der ./checkPassword.bash.txt gespeichert.
Zuerst wird dann geprüft, ob es den vom Passwort gebildet Resthash in der Datei gibt. Ist der Exit Code der grep Suche ungleich 0, gabe es keinen Treffer. Gibt es einen Treffer, wird die Trefferanzahl mit einem sed Aufruf aus der Zeile herausgeholt.
grep ${rest} ./checkPassword.bash.txt >/dev/null
if [ $? -ne 0 ]
then
echo "./checkPassword.bash.: password not found"
else
echo -n "./checkPassword.bash: number of hits : "
grep ${rest} ./checkPassword.bash.txt | sed -e 's/^.*://'
fi
Bespielaufrufe
$ ./checkPassword.bash 123456
checkPassword.bash: number of hits : 37359195
$ ./checkPassword.bash geheim
checkPassword.bash: number of hits : 46130
$ ./checkPassword.bash secret
checkPassword.bash: number of hits : 352091
$ ./checkPassword.bash DasSuperGeheimePassword
checkPassword.bash: password not found