Comandos UNIX: buscar

Comandos UNIX: buscar

Estoy tratando de aprender los comandos de UNIX y estoy jugando este juego para aprender y estoy realmente estancado en este momento. Estoy en un servidor a través de ssh y el directorio está lleno de archivos y carpetas aleatorios 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 me devolvió una gran cantidad de archivos. La única ayuda legible para humanos que puedo encontrar en el manual o en línea es imprimir los tamaños de archivo en formato legible para humanos. ¿Entonces estoy un poco perdido?

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

Respuesta1

Para filtrar los nombres de archivos legibles por humanos, puede utilizar [:print:](imprimible)clase de personajenombre. Encontrará más información sobre estas clases en el manual de grep.

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

Pensándolo bien, el requisito de "legible por humanos" podría referirse al contenido del archivo, en lugar de a su nombre. En otras palabras, estarías buscandotextoarchivos. Eso es un poco más complicado. Como sugirió @D_Bye en un comentario, luego debe usar el filecomando para determinar el tipo de contenido del archivo. Pero no sería una buena idea ejecutar 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 como filefunciona la parte:

  • El-execEl predicado se ejecuta sh -c 'file -b $0 | grep -q text' FILENAMEpara cada uno FILENAMEque satisface todas las condiciones anteriores (tipo, tamaño, no ejecutable).
  • Para cada uno de esos archivos, un shell ( sh) ejecuta este breveguion: file -b $0 | grep -q text, reemplazándolo $0con el nombre del archivo.
  • ElfileEl programa determina el tipo de contenido de cada archivo y genera esta información. La -bopción evita imprimir el nombre de cada archivo probado.
  • grepfiltra la salida procedente del fileprograma, buscando líneas que contengan"texto". (Compruebe usted mismo cómo filese ve una salida típica del comando).
  • Pero grepno genera el texto filtrado, porque tiene la-qOpción (tranquila) dada. Lo que hace es simplemente cambiar suestado de salidaa 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 procedente de grepse pasa sha findy actúa como el resultado final de toda la " -exec sh -c 'file $0 | grep -q text' {} \;" prueba.
  • En caso de que la prueba anterior arrojara resultadosverdadero, se ejecuta el -printcomando (es decir, se imprime el nombre del archivo probado).

Respuesta2

find . -type f -readable -size 1033c ! -executable

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

Respuesta3

todo lo que escribí fue:

find -size 1033c ! -executable

y obtuve el archivo. Aparentemente, la parte legible por humanos era para desconcertarte.

Respuesta4

Sin embargo, creo que para el juego la sintaxis correcta es:

file ./* 

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

información relacionada