Hallo zusammen,

ich nutze als Passwortmanager ein dmenu-Skript, welches lpcli aufruft (Kommandozeilenversion von Lesspass) und die nötigen Daten (Nutzername und Passwort) mittels xdotool in die Felder reinschreibt.

Super Sache! Brauche kein Plugin, geht in jedem Programm, …

Bei Lesspass kann man auswählen, was das Passwort beinhalten soll: Kleinbuchstaben, Großbuchstaben, Zahlen, Sonderzeichen. Und es gibt einen Zähler, den man raufsetzen kann, wodurch bei gleichem Eingang (Hauptpasswort, Nutzername und Internetadresse) ein komplett neues Passwort generiert wird.

Nun gibt es aber eben so Seiten, die Sonderzeichen zwar verlangen, aber eben nur eine begrenzte Auswahl. Daher ist mein Gedanke, dass ich ein Skript schreibe, welches ein generiertes Passwort anschaut, prüft, ob ausschließlich die erlaubten Zeichen enthält und den Zähler so lange hochsetzt, bis ein passendes Passwort herausgekommen ist.

Wie könnte / sollte dafür in Bash die if-Abfrage aussehen? Ich bin kein großartiger Programmierer, muss mir so etwas immer zusammensuchen. Aktuell sieht sie so aus und es tut nicht, was es soll.

#!/bin/sh

counter=1
passwordlength=35
options="-luds"
DMENU_PASS="dmenu -P"
config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/dmenu-lesspass"
items_cache="$config_dir/items"
mkdir -p "$config_dir"
touch "$items_cache"
item=$(echo -e "$(cat "$items_cache")" | dmenu -p "Item: ") || exit

master=$(echo | $DMENU_PASS -p "Master Password: ") || exit
while true
do
 password="$(echo "$master" | lpcli $(echo "$item") $options -n $passwordlength -c $counter -p | sed '$!d')"
 if [[ $password =~ ^['@''$''!''%''*''?''§''#'',''.''-''_'';'0-9A-Za-z]+$ ]]
 then
  echo "$counter"
  echo "$password"
  break
 fi
 counter=$((counter+1))
done

Das spuckt mir dann den Zähler aus, den ich in mein Skript für die spezielle Webseite übernehme (über Switch-Cases) und das Passwort.

Problem ist, dass das letztlich ausgespuckte Passwort neben den angegeben noch viele weitere Sonderzeichen enthält. Die erlaubt die Webseite dann aber nicht.

Bitte also um Hilfe, ich scheitere hier… Danke!

edit: Warum wird der Code denn nicht gescheit angezeigt?

  • niemand hat auf diesen Beitrag geantwortet.

    n815i3xjx8lomlny Daher ist mein Gedanke, dass ich ein Skript schreibe, welches ein generiertes Passwort anschaut, prüft, ob ausschließlich die erlaubten Zeichen enthält und den Zähler so lange hochsetzt, bis ein passendes Passwort herausgekommen ist.

    Erscheint mir sehr umständlich und verschwenderisch, mit Blick auf Ressourcen. Wie wär’s mit einem Pool der erlaubten Zeichen, etwa ein Array, und die Rückgabe des RNG wird darauf abgebildet? Das ist eigentlich™ der übliche Weg bei solcherlei Dingen.

    n815i3xjx8lomlny edit: Warum wird der Code denn nicht gescheit angezeigt?

    weil’s 
    für mehrzeilige Codeblöcke 
    am Anfang und am Ende
    je drei von den ` braucht

      niemand Wie wär’s mit einem Pool der erlaubten Zeichen, etwa ein Array, und die Rückgabe des RNG wird darauf abgebildet?

      Ok, danke für den Hinweis. Ich schau mal, ob ich rausfinde, wie das geht.

      Ich würde mir merken, wieviele Zeichen pro Zeichenklasse vorhanden sind und dann überprüfen, ob die Bedingungen erfüllt sind.

      Eine kleine Starthilfe für Perl:

      #!/usr/bin/perl -w
      
      use warnings;
      use strict;
      
      my $passwort = "Die12bestenPasswörterSindGeheim";
      my %zeichen;
      
      foreach my $character (split('', $passwort)) {
        if ($character =~ m/[a-zA-Z]/) {
          $zeichen{buchstaben}++;
        } elsif ($character =~ m/\d/) {
          $zeichen{ziffern}++;
        } elsif ($character =~ m/\S/) {
          $zeichen{sonderzeichen}++;
        }
      }
      
      printf "Anzahl Zeichen: %d\nAnzahl Ziffern: %d\nAnzahl Sonstiges: %d\n",
        $zeichen{buchstaben},
        $zeichen{ziffern},
        $zeichen{sonderzeichen};
      
      print "Zuwenig Buchstaben!\n" if (20 >= $zeichen{buchstaben});
      print "Zuwenig Ziffern!\n" if (3 >= $zeichen{ziffern});
      print "Zuwenig Sonstiges!\n" if (3 >= $zeichen{sonderzeichen});

      So, jetzt habe ich wieder einen frischeren Kopf und habe mir eure Antworten nochmal durchgelesen. Danke dafür!

      Allerdings möchte ich wirklich bei lesspass als Passwortmanager bleiben! Das heißt, dass ich keinen Zufallsgenerator nehmen möchte.

      Dieses Ermitteln des richtigen Zählers ist natürlich ein recht großer Aufwand, aber das muss ich dann nur ein einziges Mal machen, danach weiß ich den Zähler ja und kann ihn in mein Passwortmanager-Skript einfügen. Daher darf mein Rechner dafür gerne mal bissl länger im Hintergrund rödeln.

      Mir gefällt einfach die Vorstellung, dass keins meiner Passwörter irgendwo gespeichert ist. Wenn ich einen Zufallsgenerator anwerfe, dann erhalte ich damit sicherlich ein super Passwort! Das müsste ich aber halt wo speichern!

      Irgendwie werde ich das schon hinbekommen, wie ich es haben möchte. Sobald ich ein Ergebnis habe, werde ich es natürlich gerne hier teilen. Der Code wird bestimmt nicht schön sein, aber damit müsst ihr dann leben 😉