if grep -q "�" out.txt
then
echo "working"
else
cat out.txt
fi
Fondamentalement, si le fichier "out.txt" contient "�" n'importe où dans le fichier, je voudrais qu'il répète "working" ET si le fichier "out.txt" ne contient PAS "�" n'importe où dans le fichier, alors je voudrais à cat out.txt
EDIT: Voici donc ce que je fais. J'essaie de forcer brutalement un déchiffrement OpenSSL.
openssl enc retourne 0 en cas de succès, différent de zéro sinon. Remarque: vous obtiendrez des faux positifs car AES/CBC ne peut déterminer que si le "décryptage fonctionne" en fonction du bon remplissage. Donc, le fichier se déchiffre mais ce ne sera pas le bon mot de passe, il y aura donc du charabia. Un caractère commun dans le charabia est "�". Je veux donc que la boucle do continue si la sortie contient "�".
Voici mon lien git https://github.com/Raphaeangelo/OpenSSLCracker Voici le script
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
il me montre toujours la sortie avec le � charicter dedans
MISE À JOUR: Résolu
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
n'est pas le bon outil pour le travail.
Vous voyez le � U+FFFD REPLACEMENT CHARACTER
non pas parce qu'il se trouve littéralement dans le contenu du fichier, mais parce que vous avez regardé un fichier binaire avec un outil qui est censé gérer uniquement les entrées textuelles. La façon standard de gérer les entrées non valides (c'est-à-dire les données binaires aléatoires) consiste à remplacer tout ce qui n'est pas valide dans les paramètres régionaux actuels (probablement UTF-8) par U + FFFD avant qu'il n'apparaisse à l'écran.
Cela signifie qu'il est très probable qu'un littéral \xEF\xBF\xBD
(La séquence d'octets UTF-8 pour le caractère U + FFFD) ne se produise jamais dans le fichier. grep
a tout à fait raison de vous le dire, il n'y en a pas.
Une façon de détecter si un fichier contient un binaire inconnu est avec la commande file(1)
:
$ head -c 100 /dev/urandom > rubbish.bin
$ file rubbish.bin
rubbish.bin: data
Pour tout type de fichier inconnu, il dira simplement data
. Essayer
$ file out.txt | grep '^out.txt: data$'
pour vérifier si le fichier contient vraiment des fichiers binaires arbitraires et donc très probablement.
Si vous voulez vous assurer que out.txt
Est un fichier texte encodé en UTF-8 uniquement, vous pouvez également utiliser iconv
:
$ iconv -f utf-8 -t utf-16 out.txt >/dev/null
TL; DR:
grep -axv '.*' out.txt
Les deux réponses actuelles sont extrêmement trompeuses et fondamentalement erronées.
Pour tester, obtenez ces deux fichiers (d'un développeur très réputé: Markus Kuhn):
$ wget https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt
$ wget https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
La première UTF-8-demo.txt
est un fichier conçu pour montrer à quel point UTF-8 est capable de présenter de nombreuses langues, mathématiques, braille et de nombreux autres types de caractères utiles. Jetez un oeil avec un éditeur de texte (qui comprend utf-8) et vous verrez beaucoup d'exemples et no�
.
Le test qu'une réponse propose: limiter la plage de caractères à \x00-\x7F
rejettera presque tout ce qui se trouve dans ce fichier.
C'est très faux et ne supprimera pas �
car il n'y en a pas dans ce fichier.
L'utilisation du test recommandé dans cette réponse supprimera 72.5 %
du fichier:
$ grep -oP "[^\x00-\x7F]" UTF-8-demo.txt | tr -d '\n' | wc -c
10192
$ cat UTF-8-demo.txt | wc -c
14058
Il s'agit (pour la plupart des applications pratiques) de l'ensemble du dossier. Un fichier très bien conçu pour montrer des caractères parfaitement valides.
Le deuxième fichier est conçu pour essayer plusieurs cas de frontière afin de confirmer que les lecteurs utf-8 font du bon travail. Il contient à l'intérieur de nombreux caractères qui feront apparaître un `` � ''. Mais l'autre recommandation de réponse (celle sélectionnée) d'utiliser file
échoue grossièrement avec ce fichier. Supprimer uniquement un octet zéro (\0
) (qui est techniquement ASCII valide) et un \x7f
octet (DEL - supprimer) (qui est clairement un ASCII également) fera de all le fichier valide pour la commande file
:
$ cat UTF-8-test.txt | tr -d '\0\177' > a.txt
$ file a.txt
a.txt: Non-ISO extended-ASCII text, with LF, NEL line terminators
Non seulement file
ne parvient pas à détecter les many caractères incorrects, mais également à détecter et à signaler qu'il s'agit d'un fichier codé UTF-8.
Et oui, file
est capable de détecter et de signaler du texte encodé en UTF-8:
$ echo "ééakjfhhjhfakjfhfhaéá" | file -
/dev/stdin: UTF-8 Unicode text
De plus, file
ne parvient pas à signaler comme ASCII la plupart des caractères de contrôle compris entre 1 et 31. Il (file
) signale certaines plages comme data
:
$ printf '%b' "$(printf '\\U%x' {1..6})" | file -
/dev/stdin: data
D'autres comme ASCII text
:
$ printf '%b' "$(printf '\\U%x' 7 {9..12})" | file -
/dev/stdin: ASCII text
En tant que plage de caractères imprimables (avec sauts de ligne):
$ printf '%b' "$(printf '\\U%x' {32..126} 10)" | file -
/dev/stdin: ASCII text
Mais certaines plages peuvent provoquer des résultats étranges:
$ printf '%b' "$(printf '\\U%x' {14..26})" | file -
/dev/stdin: Atari MSA archive data, 4113 sectors per track, starting track: 5141, ending track: 5655
Le programme file
n'est pas un outil pour détecter du texte, mais pour détecter les nombres magic dans les programmes ou fichiers exécutables.
Les plages file
détectent et le type correspondant signalé que j'ai trouvé était:
Valeurs d'un octet, principalement ascii:
{1..6} {14..26} {28..31} 127 :data
{128..132} {134..159} :Non-ISO extended-ASCII text
133 :ASCII text, with LF, NEL line terminators
27 :ASCII text, with escape sequences
13 :ASCII text, with CR, LF line terminators
8 :ASCII text, with overstriking
7 {9..12} {32..126} :ASCII text
{160..255} :ISO-8859 text
Plages codées Utf-8:
{1..6} {14..26} {28..31} 127 :data
27 :ASCII text, with escape sequences
13 :ASCII text, with CR, LF line terminators
8 :ASCII text, with overstriking
7 {9..12} {32..126} :ASCII text
{128..132} {134..159} :UTF-8 Unicode text
133 :UTF-8 Unicode text, with LF, NEL line terminators
{160..255} :UTF-8 Unicode text
{256..5120} :UTF-8 Unicode text
Une solution possible se trouve ci-dessous.
La valeur Unicode du personnage que vous publiez est:
$ printf '%x\n' "'�"
fffd
Oui, c'est un Caractère Unicode 'REMPLACEMENT CHARACTER' (U + FFFD) . C'est un caractère utilisé pour remplacer n'importe quel invalide caractère Unicode trouvé dans le texte. C'est une "aide visuelle", pas un vrai personnage. Pour rechercher et répertorier toutes les lignes complètes contenant des caractères UNICODE non valides, utilisez:
grep -axv '.*' out.txt
mais si vous voulez seulement détecter si un caractère n'est pas valide, utilisez:
grep -qaxv '.*' out.txt; echo $?
Si le résultat est 1
le fichier est propre, sinon il sera nul 0
.
Si ce que vous demandiez était: comment trouver le �
, utilisez donc ceci:
➤ a='Basically, if the file "out.txt" contains "�" anywhere in the file I'
➤ echo "$a" | grep -oP $(printf %b \\Ufffd)
�
Ou si votre système traite correctement le texte UTF-8, simplement:
➤ echo "$a" | grep -oP '�'
�
Cette réponse très précoce était pour le poste d'origine qui était:
Comment grep pour unicode � dans un script bash
if grep -q "�" out.txt then echo "working" else cat out.txt fi
Fondamentalement, si le fichier "out.txt" contient "�" n'importe où dans le fichier, je voudrais qu'il répète "working" ET si le fichier "out.txt" ne contient PAS "�" n'importe où dans le fichier, alors je voudrais à cat out.txt
Essayer
grep -oP "[^\x00-\x7F]"
avec un if .. then
déclaration comme suit:
if grep -oP "[^\x00-\x7F]" file.txt; then
echo "grep found something ..."
else
echo "Nothing found!"
fi
Explication????:
-P
, --Perl-regexp
: PATTERN est une expression régulière Perl-o
, --only-matching
: affiche uniquement la partie d'une ligne correspondant au MOTIF[^\x00-\x7F]
est une expression régulière pour correspondre à un seul caractère non ASCII.[[:ascii:]]
- correspond à un seul ASCII char[^[:ascii:]]
- correspond à un seul caractère non ASCIIdans bash
LC_COLLATE=C grep -o '[^ -~]' file