Estoy tratando de encontrar una manera eficiente de hacer el nivel 5 del desafío de bandido OverTheWire .
De todos modos, tengo un montón de archivos, y solo hay uno que respeta los siguientes criterios:
- Legible por humanos
- 1033 bytes de tamaño
- No ejecutable
En este momento, estoy usando el findcomando y puedo encontrar los archivos que coinciden con los 2 últimos criterios:
find . -size 1033c ! -executable
Sin embargo, no sé cómo excluir archivos no legibles por humanos. Las soluciones que encontré para ese desafío usan el -readableparámetro de prueba, pero no creo que esto funcione. -readablesolo mira los permisos de los archivos, y no su contenido, mientras que la descripción del desafío solicita un archivo ASCII o algo así.

Respuestas:
Sí, puede usar
findpara buscar archivos no ejecutables del tamaño correcto y luego usarfilepara verificar ASCII. Algo como:La pregunta, sin embargo, no es tan simple como parece. 'Legible por humanos' es un término terriblemente vago. Presumiblemente, te refieres al texto. OK, pero ¿qué tipo de texto? ¿Carácter latino ASCII solamente? Unicode completo? Por ejemplo, considere estos tres archivos:
Todos estos son legibles por texto y humanos. Ahora, veamos qué
filehace de ellos:Entonces, el
findcomando anterior solo encontraráfile1(por el bien de este ejemplo, imaginemos que esos archivos tenían 1033 caracteres). Puede expandirfindpara buscar la cadenatext:Con el
-w,grepsolo imprimirá líneas dondetextse encuentre como una palabra independiente. Eso debería estar bastante cerca de lo que desea, pero no puedo garantizar que no haya otro tipo de archivo cuya descripción también pueda incluir la cadenatext.fuente
Si bien
-execse usa principalmente para hacer algo con los archivos que se encontraron, también puede actuar como una prueba. Por lo tanto, podemos agregarlo a sus otros criterios:Recuerde,
grepdevuelve un valor distinto de cero cuando no se encontró el patrón ysh -c "COMMAND"devolverá el resultado de la evaluación (siempre que sea válido). Por lo tanto, esto solo imprimirá archivos dondefile <filename>escupe algo que termina context, por ejemplo, "texto Unicode UTF-8" o "texto ASCII", pero no "texto ASCII extendido no ISO, con secuencias de escape".En una sola línea, incluso termina más corto que al pasar
xargs:Tenga en cuenta que puede reemplazar
sh -c 'file {} | grep "text$"'con cualquier comando personalizado. Si desea verificar algo muy complejo, podría ser una mejor idea proporcionar un script de shell y usarlo en su lugar:que, a la larga, es más fácil de mantener que el historial de su shell:
fuente
text$tenga en cuenta que la coincidencia excluirá cosas reconocidas como scripts de shell. Cualquier cosa con un shebang se identifica como un guión, y esos son perfectamente legibles para los humanos.fuente
Solo necesitas usar:
Le dará el único archivo que contiene la contraseña.
fuente
Simplemente ejecute lo siguiente contra el contenido del directorio:
fuente
Por favor, intente estos comandos combinados. Funciona en mi estación.
fuente
Puedes probar esto
Tu desafío no lo permite
grep. el archivo de contraseña se informará como "texto ASCII, con líneas muy largas"fuente
Para filtrar los nombres de archivo legibles por humanos, puede hacer uso del nombre de la clase de caracteres
[:print:]( imprimible ) . Encontrará más información sobre tales clases en el manual de .grepPensándolo bien, el requisito de "lectura humana" podría referirse al contenido del archivo, en lugar de su nombre. En otras palabras, estaría buscando archivos de texto . Eso es un poco más complicado. Como @D_Bye sugirió en un comentario, debe usar el
filecomando para determinar el tipo de contenido del archivo. Pero no sería una buena idea correrfiledespués de una tubería, porque complicaría la tarea de mostrar el nombre del archivo. Esto es lo que sugiero:Así es brevemente cómo
filefunciona la parte:-execpredicado se ejecutash -c 'file -b $0 | grep -q text' FILENAMEpara cada unoFILENAMEque satisfaga todas las condiciones anteriores (tipo, tamaño, no ejecutable).sh) ejecuta este breve script :,file -b $0 | grep -q textreemplazando$0con el nombre del archivo.fileprograma determina el tipo de contenido de cada archivo y genera esta información. La-bopción impide imprimir el nombre de cada archivo probado.grepfiltra la salida proveniente delfileprograma, buscando líneas que contengan "texto" . (Vea usted mismo cómo sefileve una salida típica del comando).grepno genera el texto filtrado, porque tiene la-qopción (silenciosa) dada. Lo que hace es cambiar su estado de salida a0(que representa "verdadero" - se encontró el texto filtrado) o 1 (que significa "error" - el texto "texto" no apareció en la salida defile).grepse pasa másshafinday actúa como el resultado final de la "-exec sh -c 'file $0 | grep -q text' {} \;" prueba completa.-printse ejecuta el comando (es decir, se imprime el nombre del archivo probado).fuente
fuente
le conseguirá el archivo del ejercicio
fuente
Fan de una camisa
fuente
Creo que la forma más larga de encontrar la contraseña para este nivel de bandido mencionado por la mayoría de los anteriores utilizando find y grep es el comando más descriptivo.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCIIPero, después de usar el comando 'archivo' más, me di cuenta de que es bastante fácil localizar archivos legibles por humanos (también conocido como ASCII en este nivel) de esta manera al verificar los tipos de archivos de directorios completos. El directorio inhere contiene archivos con el nombre '-filexx' o verifica rápidamente todo el directorio inhere con
file ./*Aquí estaba mi enfoque.
fuente
obtendrá tu resultado
fuente