if grep -q "�" out.txt
then
echo "working"
else
cat out.txt
fi
Grundsätzlich, wenn die Datei "out.txt" irgendwo in der Datei " " enthält, möchte ich, dass sie "funktioniert" wiedergibt UND wenn die Datei "out.txt" NICHT " " irgendwo in der Datei enthält, dann möchte ich es zu cat out.txt
EDIT: Also hier ist was ich tue. Ich versuche, eine openssl-Entschlüsselung brutal zu erzwingen.
openssl enc gibt bei Erfolg 0 zurück, andernfalls ungleich Null. Hinweis: Sie erhalten falsch positive Ergebnisse, da AES / CBC nur anhand der richtigen Auffüllung feststellen kann, ob "Entschlüsselung funktioniert". Die Datei entschlüsselt also, aber es wird nicht das richtige Passwort sein, so dass es Kauderwelsch enthält. Ein häufiges Zeichen im Kauderwelsch ist " ". Ich möchte also, dass die do-Schleife weiter läuft, wenn die Ausgabe " " enthält.
Hier ist mein Git-Link https://github.com/Raphaeangelo/OpenSSLCracker Hier ist das Skript
while read line
do
openssl aes-256-cbc -d -a -in $1 -pass pass:$line -out out.txt 2>out.txt >/dev/null && printf "==================================================\n"
if grep -q "�" out.txt
then
:
else
cat out.txt &&
printf "\n==================================================" &&
printfn"\npassword is $line\n" &&
read -p "press return key to continue..." < /dev/tty;
fi
done < ./password.txt
Es zeigt mir immer noch die Ausgabe mit dem -Zeichen darin
UPDATE: Gelöst
printf "Working..."
while read line
do
openssl aes-256-cbc -d -a -in $1 -pass pass:$line -out out.txt 2>out.txt >/dev/null
if file out.txt | grep -q 'out.txt: ASCII text'
then
printf "\n==================================================\n\n" &&
cat out.txt &&
printf "\n==================================================" &&
printf "\npassword is $line\n" &&
read -p "press return key to continue..." < /dev/tty;
else
:
fi
done < ./password.txt
grep
lange versteht Unicode (was es viel langsamer macht, so dass die Suche nach ASCII-StringsLANG=C grep
eine enorme Leistungsverbesserung ist).How to grep for unicode � in a bash script
wirklich das, was Sie wollen? den Unicode extrahieren? Bitte klären Sie, damit wir Ihnen helfen können!Antworten:
grep
ist das falsche Werkzeug für den Job.Sie sehen das
U+FFFD REPLACEMENT CHARACTER
nicht, weil es buchstäblich im Dateiinhalt enthalten ist, sondern weil Sie eine Binärdatei mit einem Tool betrachtet haben, das nur textbasierte Eingaben verarbeiten soll. Die Standardmethode für die Behandlung ungültiger Eingaben (dh zufälliger Binärdaten) besteht darin, alles, was im aktuellen Gebietsschema (höchstwahrscheinlich UTF-8) nicht gültig ist, durch U + FFFD zu ersetzen, bevor es auf den Bildschirm gelangt.Das heißt, es ist sehr wahrscheinlich, dass ein Literal
\xEF\xBF\xBD
(die UTF-8-Byte-Sequenz für das U + FFFD-Zeichen) niemals in der Datei vorkommt.grep
Es ist völlig richtig, Ihnen zu sagen, dass es keine gibt.Eine Möglichkeit, festzustellen, ob eine Datei eine unbekannte Binärdatei enthält, ist der folgende
file(1)
Befehl:Für jeden unbekannten Dateityp wird einfach gesagt
data
. Versuchenum zu überprüfen, ob die Datei wirklich eine beliebige Binärdatei und damit höchstwahrscheinlich Müll enthält.
Wenn Sie das sicherstellen möchten
out.txt
es sich nur um eine UTF-8-codierte Textdatei handelt, können Sie alternativ Folgendes verwendeniconv
:quelle
file
Erkennt möglicherweise einen anderen Inhaltstyp für diese Dateien. Wenn Sie immer zu 100% nur UTF-8-codierte Textdateien erwarten, können Sie überprüfeniconv
, ob eine Datei gültig ist. UTF-8 :iconv -f utf-8 -t utf-16 out.txt >/dev/null
. Wenniconv
die Datei aufgrund ungültiger UTF-8-Sequenzen nicht konvertiert werden kann, wird sie mit einem Exit-Code ungleich Null zurückgegeben.grep -axv '.*' badchars.txt
. Dadurch wird jede Zeile gedruckt, die ein ungültiges Unicode- Zeichen enthält.file
bedeutet.TL; DR:
lange Antwort
Beide vorliegenden Antworten sind äußerst irreführend und grundsätzlich falsch.
Holen Sie sich zum Testen diese beiden Dateien (von einem sehr angesehenen Entwickler: Markus Kuhn):
Demo
Die erste
UTF-8-demo.txt
ist eine Datei, die zeigen soll, wie gut UTF-8 viele Sprachen, Mathematik, Braille und viele andere nützliche Zeichentypen darstellen kann. Werfen Sie einen Blick mit einem Texteditor (der utf-8 versteht) und Sie werden viele Beispiele sehen und nein�
.Der Test, den eine Antwort vorschlägt: Um den Zeichenbereich auf zu beschränken,
\x00-\x7F
wird fast alles in dieser Datei abgelehnt.Das ist sehr falsch und wird keine entfernen,
�
da es keine in dieser Datei gibt .Wenn Sie den in dieser Antwort empfohlenen Test verwenden, wird
72.5 %
die Datei entfernt:Das ist (für die meisten praktischen Zwecke) die gesamte Datei. Eine Datei, die sehr gut gestaltet ist, um perfekt gültige Zeichen anzuzeigen.
Prüfung
Die zweite Datei soll mehrere Grenzfälle versuchen, um zu bestätigen, dass utf-8-Leser gute Arbeit leisten. Es enthält viele Zeichen, die dazu führen, dass ein ' ' angezeigt wird. Die andere Antwortempfehlung (die ausgewählte), die verwendet werden soll,
file
schlägt bei dieser Datei jedoch grob fehl. Nur das Entfernen eines Null-Bytes (\0
) (das technisch als ASCII gültig ist) und eines\x7f
Bytes (DEL - delete) (das eindeutig auch ein ASCII-Zeichen ist) macht die gesamte Datei für denfile
Befehl gültig :Nicht nur
file
versäumt es, die vielen zu erkennen falschen Zeichen , sondern es wird auch nicht erkannt und gemeldet, dass es sich um eine UTF-8-codierte Datei handelt.Und ja,
file
kann UTF-8-codierten Text erkennen und melden:Außerdem werden die
file
meisten Steuerzeichen im Bereich von 1 bis 31 nicht als ASCII gemeldet.file
Einige Bereiche werden wie folgt gemeldetdata
:Andere als
ASCII text
:Als druckbarer Zeichenbereich (mit Zeilenumbrüchen):
Einige Bereiche können jedoch zu seltsamen Ergebnissen führen:
Das Programm
file
ist kein Werkzeug zum Erkennen von Text, sondern zum Erkennen magischer Zahlen in ausführbaren Programmen oder Dateien.Die erkannten Bereiche
file
und der entsprechende Typ, den ich gefunden habe, waren:Ein-Byte-Werte, meistens ASCII:
Utf-8-codierte Bereiche:
Eine mögliche Lösung liegt unten.
Vorherige Antwort.
Der Unicode-Wert für das Zeichen, das Sie veröffentlichen, lautet:
Ja, das ist ein Unicode-Zeichen 'REPLACEMENT CHARACTER' (U + FFFD) . Dies ist ein Zeichen, das verwendet wird, um ungültige Unicode-Zeichen im Text zu ersetzen . Es ist eine "visuelle Hilfe", kein wirklicher Charakter. Um jede vollständige Zeile zu finden und aufzulisten , die ungültige UNICODE- Zeichen enthält , verwenden Sie:
Wenn Sie jedoch nur feststellen möchten, ob ein Zeichen ungültig ist, verwenden Sie:
Wenn das Ergebnis ist, dass
1
die Datei sauber ist, ist sie ansonsten Null0
.Wenn Sie gefragt haben, wie Sie den
�
Charakter finden, verwenden Sie Folgendes:Oder wenn Ihr System UTF-8-Text korrekt verarbeitet, einfach:
quelle
grep -axv '.*'
!! Ich habe ein oder zwei Jahrzehnte lang mit ein paar schlechten Zeichen in meinen Textdateien zu kämpfen gehabt und wie man sie in Emacs repariert !!!Diese sehr frühe Antwort war für den ursprünglichen Beitrag, der lautete:
Versuchen
mit einer
if .. then
Aussage wie folgt:Erklärung💡:
-P
,--perl-regexp
: PATTERN ist ein regulärer Perl-Ausdruck-o
,--only-matching
: Nur den Teil einer Zeile anzeigen, der mit MUSTER übereinstimmt[^\x00-\x7F]
ist ein regulärer Ausdruck für ein einzelnes Nicht-ASCII-Zeichen.[[:ascii:]]
- Entspricht einem einzelnen ASCII-Zeichen[^[:ascii:]]
- Entspricht einem einzelnen Nicht-ASCII-Zeichenim
bash
quelle
printf '%b' "$(printf '\\U%x' {128..131})" | grep -oP "[^\x00-\x7F]"
Nur 4 gültige Unicode-Zeichen, die Ihr Code ablehnt. :-(