Поиск определенного магического байта в океане файлов

Поиск определенного магического байта в океане файлов

Я хочу узнать, как искать файлы определенного типа: я вошел на SSH-сервер и пытаюсь найти файл .jpg, но владелец сервера (мой учитель) удалил все расширения.

Я попробовал grep -lr "JFIF"и нашел много каталогов с одинаковым именем файла, поэтому я перешел в случайный каталог, который был найден с помощью команды grep, и попытался применить catкоманду к нему, но терминал не смог отобразить весь двоичный файл.

Также stringsкоманда заблокирована на сервере ssh, мой учитель сказал, что нужно найти файл jpg и что этот файл содержит серийный номер (SN), но я понятия не имею, где его найти.

Если вам нужны SSH-кардиналы, я с радостью вам их выдам. В любом случае, мой учитель сказал, что fileдля этого можно использовать команду, но я не знаю, как это сделать.

Кстати: он сказал (СН)

решение1

Я постараюсь дать вам несколько подсказок, чтобы вы смогли решить свою домашнюю задачу самостоятельно.

Выполните следующие действия:

  1. прочитайте руководство, fileвыполнив man file.
  2. Затем попробуйте file somefileи посмотрите, что получится.
  3. Попробуйте запустить fileна разных типах файлов
  4. К настоящему моменту вы должны понимать, как определить, является ли файл изображением JPEG или нет.
  5. Теперь прочитайте руководство find(или воспользуйтесь Google, чтобы узнать, как использовать его для поиска всех файлов в определенном каталоге и всех подкаталогах)
  6. теперь узнайте, как использовать -execопцию findдля того, чтобы связать ее с ранее использованной fileкомандой
  7. Теперь вы сможете узнать типы файлов всех файлов в нужном каталоге и вывести их список.
  8. Теперь прочтите о каналах |и grepкомандах, чтобы узнать, как фильтровать только файлы JPEG.

решение2

Прежде всего я хочу поблагодарить @incBrain и @Serg за то, что они не ответили на мой вопрос напрямую, что помогло мне понять много нового :).

Моя задача состояла в том, чтобы найти определенный .jpgфайл, у которого удалено расширение. Первое, что пришло мне в голову, это.jpg магический байтчто было JFIF, и с помощью инструкций @incBrain я смог построить эту команду

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

эта строка связывает findкоманду с fileкомандой, используя -execзатем получает вывод обеих команд find& fileи передает его в качестве ввода через символ конвейера |для grepкоманды, которая показывает только файлы, содержащие JFIFв своем двоичном файле .jpg files.

Моя проблема на самом деле заключалась в поиске конкретного серийного номера. Сначала я думал, что серийный номер включен в двоичный файл файла, но это было не так, затем мне в голову пришла безумная мысль.

Ой! Почему я не вижу, как выглядит фотография? Я имею в виду, если я не могу найти серийный номер, было бы неплохо получить фотографию.

Я искал в Интернете хороший способ передачи файлов из SSH на мою машину и нашел этот блок кода, который сработал!

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

Надеюсь, этот ответ поможет кому-нибудь в будущем :).

решение3

Одним из возможных решений может быть следующее: использование find, которое рекурсивно перечисляет обычные файлы ( -type f), и выполняет fileкоманду для каждого из них. Перенаправить вывод в , чтобы grepотфильтровать типы файлов.

Однако здесь мне хотелось бы сделать что-то более забавное; более неловкое, но более забавное.

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

Как вы можете знать или не знать, каждый файл имеет первые 8 байт любого файла, обозначающих тип файла. Таким образом, используя findмы ищем все обычные файлы, печатаем их имя, но затем выполняем hexdump для извлечения первых 8 байт и отфильтровываем awkтолько те имена файлов, которые имеют эти первые 8 байт.

Вот небольшое доказательство:

$ 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

решение4

file * | grep -i "jpeg"

Это выполнит поиск по каждому файлу в каталоге и вернет его тип файла. |Затем через Pipe эти результаты просматриваются grep, чтобы найти файл с типом файла "jpeg" или, по сути, файл .jpg.

Связанный контент