Buscando un byte mágico específico en un océano de archivos

Buscando un byte mágico específico en un océano de archivos

Quiero saber cómo puedo buscar un tipo de archivo específico: he ingresado a un servidor SSH y estoy intentando buscar un .jpgarchivo, pero el propietario del servidor (mi maestro) ha eliminado todas las extensiones.

Lo intenté grep -lr "JFIF"y encontré muchos directorios con el mismo nombre de archivo, así que salté a un directorio aleatorio que se encontró con el grepcomando e intenté usar el catcomando en él, pero la terminal no pudo mostrar el binario completo.

Además el stringscomando está bloqueado en el servidor ssh, mi profesor dijo que hay que buscar un archivo jpg y que este archivo contiene un número de serie (SN), pero no tengo idea de dónde encontrarlo.

Si quieren los cardenales SSH, estaré feliz de entregárselos; de todos modos, mi maestro dijo que pueden usar el filecomando para hacerlo, pero no sé cómo hacerlo.

Por cierto: dijo (SN)

Respuesta1

Intentaré darte algunos consejos para que puedas resolver tu HW tú mismo.

Siga estos pasos:

  1. lea el manual de fileejecutando man file.
  2. Luego pruébalo file somefiley mira qué pasa.
  3. Intente ejecutar fileen diferentes tipos de archivos
  4. A estas alturas ya deberías poder entender cómo saber si un archivo es una imagen jpeg o no.
  5. ahora lea el manual find(o use Google para descubrir cómo usarlo para encontrar todos los archivos en algún directorio y todos los subdirectorios)
  6. ahora descubra cómo usar -execla opción de findpara conectarla con fileel comando usado anteriormente
  7. Ahora debería poder encontrar los tipos de archivos de todos los archivos en el directorio necesario y enumerarlos.
  8. Ahora lea sobre canalizaciones |y grepcomandos para descubrir cómo filtrar sólo para archivos JPEG.

Respuesta2

En primer lugar, quiero agradecer a @incBrain y @Serg por no responder mi pregunta directamente, lo que me ayudó a comprender muchas cosas nuevas :).

Mi tarea era encontrar un .jpgarchivo específico al que se le haya eliminado la extensión, lo primero que pensé es.jpg byte mágicoque era JFIF, y con las instrucciones de @incBrain pude crear este comando

find / -exec file {} \; | grep "JFIF"

esa línea vincula el findcomando al filecomando usando -execluego obtiene la salida de ambos comandos find& filey la transfiere como entrada a través del símbolo de canalización |para el grepcomando que muestra solo los archivos que contienen JFIFen su binario también conocido como .jpg files.

Mi problema en realidad fue encontrar un número de serie específico, al principio pensé que el número de serie estaba incluido en el archivo binario, pero eso estaba mal, luego me vino a la mente una idea loca.

¡Oh! ¿Por qué no veo cómo se ve la imagen? Quiero decir, si no puedo encontrar el número de serie, sería bueno obtener la imagen.

¡Busqué en Internet una buena manera de transferir archivos desde SSH a mi máquina y encontré este bloque de código que funcionó!

scp [email protected]:/home/example/file.txt /Local_Directory

Espero que esta respuesta ayude a alguien en el futuro :).

Respuesta3

Una posible solución podría ser esta: use findel cual enumera recursivamente archivos normales ( -type f) y ejecuta filecomandos sobre cada uno de ellos. Redirigir la salida a greppara filtrar los tipos de archivos.

Sin embargo, aquí me gustaría hacer algo más divertido que eso; Más incómodo, pero más divertido.

$ find .  -maxdepth 1 -type f -printf "%f\t" -exec hexdump -n8 {} \;  | awk '/d8ff e0ff 1000 464a/{print $1}'

Como puede que sepa o no, cada archivo tiene los primeros 8 bytes de cualquier archivo que designan el tipo de archivo. Por lo tanto, findbuscamos todos los archivos normales, imprimimos su nombre, pero luego ejecutamos hexdump para extraer los primeros 8 bytes y filtramos awksolo aquellos nombres de archivo que tienen esos primeros 8 bytes.

He aquí una pequeña prueba:

$ hexdump -n 10 1450763029649.jpg               
0000000 d8ff e0ff 1000 464a 4649               
000000a

$ hexdump  -C -n 10 1450763029649.jpg           
00000000  ff d8 ff e0 00 10 4a 46  49 46                    |......JFIF|
0000000a

Respuesta4

file * | grep -i "jpeg"

Esto buscará en cada archivo del directorio y devolverá su tipo de archivo. A través de Pipe |, grep busca estos resultados para encontrar el archivo con el tipo de archivo "jpeg" o básicamente un archivo .jpg.

información relacionada