Procurando por um byte mágico específico em um oceano de arquivos

Procurando por um byte mágico específico em um oceano de arquivos

Quero saber como posso pesquisar um tipo de arquivo específico: entrei em um servidor SSH e estou tentando pesquisar um .jpgarquivo, mas o proprietário do servidor (meu professor) removeu todas as extensões.

Eu tentei grep -lr "JFIF"e encontrei muitos diretórios com o mesmo nome de arquivo, então pulei para um diretório aleatório que foi encontrado com o grepcomando e tentei usar o catcomando nele, mas o terminal não conseguiu mostrar o binário inteiro.

Além disso o stringscomando está bloqueado no servidor ssh, meu professor disse que é preciso encontrar um arquivo jpg e que esse arquivo contém um número de série (SN), mas não tenho ideia de onde encontrá-lo.

Se vocês quiserem os cardeais SSH ficarei feliz em distribuí-los para vocês, de qualquer forma meu professor disse que vocês podem usar o filecomando para fazer isso, mas não sei como fazer.

Aliás: ele disse (SN)

Responder1

Vou tentar dar algumas dicas para que você mesmo resolva seu HW.

Siga estas etapas:

  1. leia o manual fileexecutando man file.
  2. Então experimente file somefilee veja o que acontece
  3. Tente rodar fileem diferentes tipos de arquivos
  4. Agora você já deve saber como descobrir se algum arquivo é uma imagem jpeg ou não.
  5. agora leia o manual find(ou use o google para descobrir como usá-lo para encontrar todos os arquivos em algum diretório e todos os subdiretórios)
  6. agora descubra como usar -execa opção de findpara conectá-lo ao filecomando usado anteriormente
  7. Agora você deve ser capaz de descobrir os tipos de arquivos de todos os arquivos no diretório necessário e listá-los
  8. Agora leia sobre pipes |e grepcomandos para descobrir como filtrar apenas arquivos JPEG.

Responder2

Em primeiro lugar quero agradecer ao @incBrain e ao @Serg por não responderem diretamente à minha pergunta, o que me ajudou a entender muitas coisas novas :).

Minha tarefa era encontrar um .jpgarquivo específico cuja extensão foi removida, a primeira coisa que pensei foi.jpg byte mágicoque era JFIF, e com instruções @incBrain consegui construir este comando

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

essa linha vincula o findcomando ao filecomando usando -exec, em seguida, obtém a saída de ambos os comandos find& filee a transfere como uma entrada através do símbolo de barra vertical |para o grepcomando que mostra apenas os arquivos que contêm JFIFem seu binário aka .jpg files.

Meu problema na verdade era encontrar um número de série específico, a princípio pensei que o número de série estivesse incluído no binário do arquivo, mas estava errado, então um pensamento maluco me veio à mente

Oh! por que não vejo como é a foto, quero dizer, se não consigo encontrar o número de série, tirar a foto seria uma coisa boa

e procurei na Internet uma boa maneira de transferir arquivos do SSH para minha máquina e encontrei esse bloco de código que funcionou!

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

Espero que esta resposta ajude alguém no futuro :).

Responder3

Uma solução possível poderia ser esta: use findque lista recursivamente os arquivos regulares ( -type f) e executa filecomandos sobre cada um deles. Redirecione a saída para greppara filtrar os tipos de arquivos.

Porém aqui, eu gostaria de fazer algo mais divertido do que isso; mais estranho, mas mais divertido.

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

Como você pode ou não saber, cada arquivo tem os primeiros 8 bytes de qualquer arquivo que designam o tipo de arquivo. Assim, findprocuramos todos os arquivos regulares, imprimimos seu nome, mas depois executamos hexdump para extrair os primeiros 8 bytes e deixamos awkfiltrar apenas os nomes de arquivos que possuem os primeiros 8 bytes.

Aqui está uma pequena prova:

$ 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

Responder4

file * | grep -i "jpeg"

Isso pesquisará todos os arquivos no diretório e retornará seu tipo de arquivo. Através do Pipe, |esses resultados são pesquisados ​​pelo grep para encontrar o arquivo com o tipo de arquivo "jpeg" ou basicamente um arquivo .jpg.

informação relacionada