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 find
comando 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 -readable
parámetro de prueba, pero no creo que esto funcione. -readable
solo 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
find
para buscar archivos no ejecutables del tamaño correcto y luego usarfile
para 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é
file
hace de ellos:Entonces, el
find
comando anterior solo encontraráfile1
(por el bien de este ejemplo, imaginemos que esos archivos tenían 1033 caracteres). Puede expandirfind
para buscar la cadenatext
:Con el
-w
,grep
solo imprimirá líneas dondetext
se 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
-exec
se 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,
grep
devuelve 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 .grep
Pensá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
file
comando para determinar el tipo de contenido del archivo. Pero no sería una buena idea correrfile
despué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
file
funciona la parte:-exec
predicado se ejecutash -c 'file -b $0 | grep -q text' FILENAME
para cada unoFILENAME
que satisfaga todas las condiciones anteriores (tipo, tamaño, no ejecutable).sh
) ejecuta este breve script :,file -b $0 | grep -q text
reemplazando$0
con el nombre del archivo.file
programa determina el tipo de contenido de cada archivo y genera esta información. La-b
opción impide imprimir el nombre de cada archivo probado.grep
filtra la salida proveniente delfile
programa, buscando líneas que contengan "texto" . (Vea usted mismo cómo sefile
ve una salida típica del comando).grep
no genera el texto filtrado, porque tiene la-q
opció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
).grep
se pasa mássh
afind
ay actúa como el resultado final de la "-exec sh -c 'file $0 | grep -q text' {} \;
" prueba completa.-print
se 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 ASCII
Pero, 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