Comandos de UNIX: buscar

9

Estoy tratando de aprender los comandos de UNIX y estoy jugando este juego para aprender y estoy realmente atrapado en este momento. Estoy en un servidor a través de ssh y el directorio está lleno de archivos y carpetas al azar y la contraseña para el siguiente nivel está dentro de uno de los archivos. Me han dicho que el archivo tiene los siguientes atributos:

  • legible por humanos
  • 1033 bytes
  • no ejecutable

Supongo que debería usar el findcomando y lo intenté, find ! -executablepero eso devolvió una carga de archivos. La única ayuda legible para humanos que puedo encontrar en el manual o en línea es imprimir los tamaños de los archivos en legibles para humanos. ¿Entonces estoy un poco perdido allí?

También lo intenté find ~ -size 1033bpero eso no devolvió nada. Pero cuando lo intenté find ~ -size -1033b, devolvió todos los archivos del directorio.

Nick Corin
fuente
¡Realmente me gustaría saber más sobre este juego!
ivanivan
2
@ivanivan bandit.overthewire.org
avgvstvs

Respuestas:

16

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

find . -type f -size 1033c -name "[[:print:]]*" ! -executable

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 filecomando para determinar el tipo de contenido del archivo. Pero no sería una buena idea correr filedespués de una tubería, porque complicaría la tarea de mostrar el nombre del archivo. Esto es lo que sugiero:

find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print

Así es brevemente cómo filefunciona la parte:

  • El -execpredicado se ejecuta sh -c 'file -b $0 | grep -q text' FILENAMEpara cada uno FILENAMEque satisfaga todas las condiciones anteriores (tipo, tamaño, no ejecutable).
  • Para cada uno de esos archivos, un shell ( sh) ejecuta este breve script :, file -b $0 | grep -q textreemplazando $0con el nombre del archivo.
  • El 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 del fileprograma, buscando líneas que contengan "texto" . (Vea usted mismo cómo se fileve una salida típica del comando).
  • Pero grepno genera el texto filtrado, porque tiene la -qopción (silenciosa) dada. Lo que hace es cambiar su estado de salida a 0(que representa "verdadero" - se encontró el texto filtrado) o 1 (que significa "error" - el texto "texto" no apareció en la salida de file).
  • El estado de salida verdadero / falso proveniente de grepse pasa más sha finday actúa como el resultado final de la " -exec sh -c 'file $0 | grep -q text' {} \;" prueba completa.
  • En caso de que la prueba anterior sea verdadera , -printse ejecuta el comando (es decir, se imprime el nombre del archivo probado).
rozcietrzewiacz
fuente
Sé que esto es antiguo, pero quiero agregar que el uso find . -type f -size 1033ctambién devolverá exactamente la misma respuesta.
Brandon Benefield
8
find . -type f -readable -size 1033c ! -executable

Tenga en cuenta que usé en clugar de bpara el tamaño del archivo. bes para bloques de 512 bytes. ces para bytes reales.

Tim Pote
fuente
2
No creo que sea -readablelegible para humanos (es decir, no binario)
hhaamu
1
@hhaamu - correcto. Sin embargo, ¡probablemente no sea malo filtrar archivos que el usuario no tiene derechos para leer! Para determinar si un archivo contiene contenido legible por humanos, canalice los nombres devueltos por finda file.
D_Bye
2

todo lo que escribí fue:

find -size 1033c ! -executable

y obtuve el archivo. Aparentemente, la parte legible para los humanos era desanimarte.

PiousCape262
fuente
0
find . -readable -size 1033c \! -executable
eb0t
fuente
legible significa que los archivos pueden ser leídos por la cuenta, eso no los hace necesariamente legibles por humanos.
Anthon
0

Creo que para el juego, sin embargo, la sintaxis correcta es:

file ./* 

Obtiene una declaración que enumera en qué consiste cada archivo. Funcionó muy bien para lo que intentas lograr en el juego Bandit. La bola curva real para esta tarea es que cada archivo comienza con - (guión).

ctfred0921
fuente
Podría mejorar esto agregando un guión en ese comando como file ./-*este.
ConstantFun
0

Creo que esta es la mejor respuesta real que cubriría las 3 condiciones

find inhere/ -type f -size 1033c ! -executable |xargs file | grep text

Pero como mucha gente dijo, el ejecutable y el legible para humanos nos iban a dejar fuera, así que usando

find inhere/ -type f -size 1033c 

es suficiente!

bleh10
fuente