if grep -q "�" out.txt
then
echo "working"
else
cat out.txt
fi
Básicamente, si el archivo "out.txt" contiene " " en cualquier parte del archivo, me gustaría que haga eco de "trabajo" Y si el archivo "out.txt" NO contiene " " en ningún lugar del archivo, me gustaría a cat out.txt
EDITAR: Entonces, esto es lo que estoy haciendo. Estoy tratando de forzar a un descifrado de OpenSL.
openssl enc devuelve 0 en caso de éxito, de lo contrario no es cero. Nota: obtendrá falsos positivos porque AES / CBC solo puede determinar si el "descifrado funciona" en función del correcto relleno. Por lo tanto, el archivo se descifra pero no será la contraseña correcta, por lo que tendrá galimatías. Un personaje común en el galimatías es " ". Entonces, quiero que el bucle do continúe si la salida contiene " ".
Aquí está mi enlace git https://github.com/Raphaeangelo/OpenSSLCracker Aquí está el 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
todavía me muestra salida con el carácter en él
ACTUALIZACIÓN: Resuelto
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
Hace tiempo que entiende unicode (lo que lo hace mucho más lento, por lo que buscar cadenas ASCIILANG=C grep
es una gran mejora del rendimiento).How to grep for unicode � in a bash script
es esto realmente lo que quiere? extraer el unicode? por favor aclarar para que podamos ayudar!Respuestas:
grep
es la herramienta incorrecta para el trabajo.Usted ve el
U+FFFD REPLACEMENT CHARACTER
no porque esté literalmente en el contenido del archivo, sino porque miró un archivo binario con una herramienta que se supone que maneja solo la entrada basada en texto. La forma estándar de manejar entradas no válidas (es decir, datos binarios aleatorios) es reemplazar todo lo que no es válido en la configuración regional actual (probablemente UTF-8) con U + FFFD antes de que llegue a la pantalla.Eso significa que es muy probable que un literal
\xEF\xBF\xBD
(la secuencia de bytes UTF-8 para el carácter U + FFFD) nunca ocurra en el archivo.grep
tiene toda la razón al decirte que no hay ninguno.Una forma de detectar si un archivo contiene algún binario desconocido es con el
file(1)
comando:Para cualquier tipo de archivo desconocido, simplemente dirá
data
. Tratarpara verificar si el archivo realmente contiene algún binario arbitrario y, por lo tanto, lo más probable es que sea basura.
Si desea asegurarse de que solo se
out.txt
trata de un archivo de texto codificado UTF-8, también puede utilizariconv
:fuente
file
detecta algún otro tipo de contenido para esos archivos. Si el 100% siempre sólo se espera UTF-8 archivos de texto codificados, se puede comprobar coniconv
, si un archivo es UTF-8 válidos:iconv -f utf-8 -t utf-16 out.txt >/dev/null
. Siiconv
no puede convertir el archivo debido a secuencias UTF-8 no válidas, volverá con un código de salida distinto de cero.grep -axv '.*' badchars.txt
. Eso imprimirá cualquier línea que contenga caracteres Unicode no válidos .file
hace.TL; DR:
respuesta larga
Ambas respuestas actuales son extremadamente engañosas y básicamente erróneas.
Para probar, obtenga estos dos archivos (de un desarrollador muy reconocido: Markus Kuhn):
Manifestación
El primero
UTF-8-demo.txt
es un archivo diseñado para mostrar qué tan bien UTF-8 puede presentar muchos idiomas, matemáticas, braille y muchos otros tipos de caracteres útiles. Eche un vistazo con un editor de texto (que entienda utf-8) y verá muchos ejemplos y no�
.La prueba que propone una respuesta: limitar el rango de caracteres a
\x00-\x7F
rechazará casi todo dentro de este archivo.Eso está muy mal y no eliminará ninguno
�
ya que no hay ninguno en ese archivo .El uso de la prueba recomendada en esa respuesta eliminará
72.5 %
el archivo:Eso es (para la mayoría de los propósitos prácticos) todo el archivo. Un archivo muy bien diseñado para mostrar caracteres perfectamente válidos.
Prueba
El segundo archivo está diseñado para probar varios casos límite para confirmar que los lectores utf-8 están haciendo un buen trabajo. Contiene muchos caracteres que harán que se muestre una ' '. Pero la otra recomendación de respuesta (la seleccionada) para usar
file
falla gravemente con este archivo. Solo eliminar un byte cero (\0
) (que técnicamente es ASCII válido) y un\x7f
byte (DEL - eliminar) (que también es claramente un carácter ASCII) hará que todo el archivo sea válido para elfile
comando:No solo no
file
puede detectar los muchos caracteres incorrectos, sino que tampoco puede detectar e informar que se trata de un archivo codificado UTF-8.Y sí,
file
es capaz de detectar e informar texto codificado en UTF-8:Además,
file
no informa como ASCII la mayoría de los caracteres de control en el rango de 1 a 31. (file
) informa algunos rangos comodata
:Otros como
ASCII text
:Como el rango de caracteres imprimibles (con nuevas líneas):
Pero algunos rangos pueden causar resultados extraños:
El programa
file
no es una herramienta para detectar texto, sino para detectar números mágicos en programas o archivos ejecutables.Los rangos
file
detectados, y el tipo correspondiente informado que encontré fueron:Valores de un byte, principalmente ascii:
Rangos codificados Utf-8:
Una posible solución se encuentra a continuación.
Respuesta previa
El valor Unicode para el personaje que está publicando es:
Sí, ese es un 'CARÁCTER DE REEMPLAZO' de caracteres Unicode (U + FFFD) . Ese es un carácter utilizado para reemplazar cualquier carácter Unicode no válido encontrado en el texto. Es una "ayuda visual", no un personaje real. Para buscar y enumerar todas las líneas completas que contienen caracteres UNICODE no válidos , use:
pero si solo desea detectar si algún carácter no es válido, use:
Si el resultado es que
1
el archivo está limpio, de lo contrario será cero0
.Si lo que preguntabas era: cómo encontrar el
�
personaje, entonces usa esto:O si su sistema procesa correctamente el texto UTF-8, simplemente:
fuente
grep -axv '.*'
!! ¡¡¡He luchado con algunos caracteres malos en mis archivos de texto, y cómo solucionarlos en emacs, ¡por una o dos décadas!Esta respuesta muy temprana fue para la publicación original que era:
Tratar
con una
if .. then
declaración de la siguiente manera:Explicación💡:
-P
,--perl-regexp
: PATTERN es una expresión regular de Perl-o
,--only-matching
: muestra solo la parte de una línea que coincide con PATTERN[^\x00-\x7F]
es una expresión regular para que coincida con un solo carácter no ASCII.[[:ascii:]]
- coincide con un solo carácter ASCII[^[:ascii:]]
- coincide con un solo carácter no ASCIIen
bash
fuente
printf '%b' "$(printf '\\U%x' {128..131})" | grep -oP "[^\x00-\x7F]"
solo 4 caracteres Unicode válidos que tu código rechaza. :-(