Поиск по сайту:

Как использовать команду strings в Linux


Хотите увидеть текст внутри двоичного файла или файла данных? Команда Linux strings извлекает для вас эти биты текста, называемые «строками».

В Linux полно команд, которые могут выглядеть как решения для поиска проблем. Команда strings определенно относится к этому лагерю. Только какова его цель? Есть ли смысл в команде, которая выводит список печатных строк из двоичного файла?

Сделаем шаг назад. Двоичные файлы, такие как программные файлы, могут содержать строки удобочитаемого текста. Но как их увидеть? Если вы используете cat или less, скорее всего, вы получите зависшее окно терминала. Программы, предназначенные для работы с текстовыми файлами, плохо справляются, если через них пропускаются непечатаемые символы.

Большинство байтов в двоичном файле не читаются человеком и не могут быть выведены в окно терминала каким-либо осмысленным образом. Нет символов или стандартных символов для представления двоичных значений, которые не соответствуют буквенно-цифровым символам, знакам препинания или пробелам. В совокупности они известны как «печатные» символы. Остальные — «непечатаемые» символы.

Таким образом, попытка просмотра или поиска текстовых строк в двоичном файле или файле данных является проблемой. И вот здесь на помощь приходит strings. Он извлекает строки печатных символов из файлов, чтобы другие команды могли использовать эти строки без необходимости бороться с непечатаемыми символами.

Использование строковой команды

В команде strings нет ничего сложного, и ее основное использование очень простое. Мы указываем имя файла, который мы хотим, чтобы strings искал в командной строке.

Здесь мы собираемся использовать строки в двоичном файле — исполняемом файле, называемом «jibber». Мы набираем strings, пробел, «jibber», а затем нажимаем Enter.

strings jibber

Строки извлекаются из файла и отображаются в окне терминала.

Установка минимальной длины строки

По умолчанию строки будут искать строки, состоящие из четырех или более символов. Чтобы увеличить или уменьшить минимальную длину, используйте параметр -n (минимальная длина).

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

Некоторые двоичные значения имеют то же числовое значение, что и значение, представляющее печатный символ. Если два из этих числовых значений окажутся рядом в файле, и вы укажете минимальную длину, равную двум, эти байты будут представлены, как если бы они были строкой.

Чтобы указать минимальной длине strings два, используйте следующую команду.

strings -n 2 jibber

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

Протягивание струн через Less

Из-за длины вывода из strings мы собираемся передать его через less. Затем мы можем прокрутить файл в поисках интересующего текста.

strings jibber | less

Листинг теперь представлен для нас в формате less, при этом верхняя часть листинга отображается первой.

Использование строк с объектными файлами

Обычно файлы исходного кода программы компилируются в объектные файлы. Они связаны с файлами библиотеки для создания двоичного исполняемого файла. У нас есть объектный файл jibber, так что давайте заглянем внутрь этого файла. Обратите внимание на расширение файла «.o».

jibber.o | less

Все строки первого набора переносятся на восьмой столбец, если они длиннее восьми символов. Если они были завернуты, в девятом столбце стоит символ «H». Вы можете распознать эти строки как операторы SQL.

Прокрутка вывода показывает, что это форматирование не используется во всем файле.

Интересно увидеть различия в текстовых строках между объектным файлом и готовым исполняемым файлом.

Поиск в определенных областях файла

Скомпилированные программы имеют внутри себя различные области, которые используются для хранения текста. По умолчанию strings ищет текст во всем файле. Это так же, как если бы вы использовали опцию -a (все). Чтобы поиск строк выполнялся только в инициализированных, загруженных разделах данных в файле, используйте параметр -d (данные).

strings -d jibber | less

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

Печать смещения строки

Мы можем заставить strings печатать смещение от начала файла, в котором расположена каждая строка. Для этого используйте параметр -o (смещение).

strings -o parse_phrases | less

Смещение дается в восьмеричном формате.

Чтобы смещение отображалось в другой системе счисления, например в десятичной или шестнадцатеричной системе счисления, используйте параметр -t (основание счисления). За параметром системы счисления должен следовать d (десятичный), x (шестнадцатеричный) или o (восьмеричный). Использование -t o аналогично использованию -o.

strings -t d parse_phrases | less

Смещения теперь печатаются в десятичном формате.

strings -t x parse_phrases | less

Смещения теперь печатаются в шестнадцатеричном формате.

Включая пробелы

strings считает символы табуляции и пробела частью найденных строк. Другие пробельные символы, такие как перевод строки и возврат каретки, не обрабатываются так, как если бы они были частью строк. Параметр -w (пробел) заставляет строки обрабатывать все символы пробела, как если бы они были частью строки.

strings -w add_data | less

Мы видим пустую строку в выводе, которая является результатом (невидимого) возврата каретки и символов новой строки в конце второй строки.

Мы не ограничены файлами

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

С помощью этой команды мы можем просмотреть оперативную память (RAM) нашего компьютера.

Нам нужно использовать sudo, потому что мы обращаемся к /dev/mem. Это файл символьного устройства, который содержит изображение основной памяти вашего компьютера.

sudo strings /dev/mem | less

Список не является всем содержимым вашей оперативной памяти. Это просто строки, которые можно извлечь из него.

Поиск во многих файлах одновременно

Подстановочные знаки можно использовать для выбора групп файлов для поиска. Символ * представляет несколько символов, а символ ? представляет любой отдельный символ. Вы также можете указать несколько имен файлов в командной строке.

Мы собираемся использовать подстановочный знак и искать все исполняемые файлы в каталоге /bin. Поскольку листинг будет содержать результаты из многих файлов, мы будем использовать параметр -f (имя файла). Это напечатает имя файла в начале каждой строки. Затем мы можем увидеть, в каком файле была найдена каждая строка.

Мы передаем результаты через grep и ищем строки, содержащие слово «Авторское право».

strings -f /bin/* | grep Copyright

Мы получаем аккуратный список заявлений об авторских правах для каждого файла в каталоге /bin с именем файла в начале каждой строки.

струны распущены

В струнах нет никакой тайны; это типичная команда Linux. Он делает что-то очень конкретное и делает это очень хорошо.

Это еще один винтик Linux, и он действительно оживает, когда работает с другими командами. Когда вы видите, как она может располагаться между двоичными файлами и другими инструментами, такими как grep, вы начинаете ценить функциональность этой малоизвестной команды.

RELATED: Best Linux Laptops for Developers and Enthusiasts