![Einfaches Skript analysiert Text. Was ist hier falsch?](https://rvso.com/image/1344712/Einfaches%20Skript%20analysiert%20Text.%20Was%20ist%20hier%20falsch%3F.png)
Ich bin ein großer Benutzer vonhttps://www.grc.com/passwords.htmum sichere Passwörter zu erhalten. Allerdings wird es schnell langweilig, jedes Mal auf die Site gehen und das Passwort manuell kopieren zu müssen, also habe ich beschlossen, ein kleines Skript zu erstellen, das das für mich erledigt. Jedes Mal, wenn Sie die Seite neu laden, werden Ihnen neue Passwörter im Klartext angezeigt. Dies ist also das Skript.
curl 'https://www.grc.com/passwords.htm' | grep '63 random printable ASCII characters:' | sed 's/^.*size=2>//' | sed 's/<\/font>.*$//' | pbcopy
Da es keine identifizierenden Klassen oder IDs gibt, erhalte ich die Seite über curl
, leite sie an weiter, grep
um die gewünschte Zeile („63 zufällige druckbare ASCII-Zeichen:“) zu erhalten, und lösche dann mit sed
alles bis auf das Kennwort sowie alles danach und kopiere es schließlich mit in die Zwischenablage pbcopy
.
Das funktioniert alles gut, bis auf ein kleines Detail. Die Zeichenfolge, die ich am Ende erhalte, sollte immer 63 Zeichen lang sein, ist es aber nicht. Sie variiert normalerweise zwischen 64, 67, 70 und 73 und ich habe keine Ahnung, warum.
Kann jemand Licht ins Dunkel bringen?
Antwort1
AlsmousioWie bereits gesagt, liegt das Problem in der HTML-Kodierung einiger Sonderzeichen.
Perl kann diese zuverlässig und einfach konvertieren:
curl 'https://www.grc.com/passwords.htm' | \
grep 'ASCII characters:' \
perl -MHTML::Entities -ne 's/.*2>|<.*//g; print decode_entities($_)'
Antwort2
Es könnte mit der HTML-Kodierung zu tun haben, wo beispielsweise ein „a“ <
in den 63 Zeichen tatsächlich als Entität <
in der Quelle dargestellt wird, wodurch Ihre Zeichenfolge etwas länger wird.
Antwort3
Folgendes sollten Sie bedenken: Die resultierende Zeichenfolge Ihres Skripts enthält möglicherweise oft bestimmte Zeichen, die bei den Sed-Vorgängen nicht richtig maskiert werden.
Folgende Zeichen können beispielsweise verdächtig sein: Klammern, einfache und doppelte Anführungszeichen, geschweifte Klammern, Ausrufezeichen, Schrägstriche und umgekehrte Schrägstriche sowie Sternchen.
Ich würde in einer Reihe von Tests versuchen, eines dieser Zeichen aus der zurückgegebenen Zeichenfolge zu entfernen und die Ergebnisse vergleichen, um zu sehen, ob das Entfernen eines oder mehrerer dieser Zeichen die Anzahl auf 63 bringt.
Antwort4
Basierend auf Ihrem Kommentar an mousio kann Ihre grep/sed-Kette ... auf einen Befehl reduziert werden:
Perl ist normalerweise standardmäßig installiert
perl -ne 'next unless /63 random printable ASCII characters:/; s/^.*size=2>//; s/<\/font>.*$//; s/"/"/g; s/'/'\''/g; s/&/&/g; s/</</g; s/>/>/g; print; exit'
Nicht alle Seds verstehen diese Syntax
sed -n '/63 random printable ASCII characters:/{s/^.*size=2>//; s/<\/font>.*$//; s/"/"/g; s/'/'\''/g; s/&/\&/g; s/</</g; s/>/>/g; p;q}'