Як використовувати команду рядків у Linux

Бажаєте переглянути текст, що міститься у двійковому або файлі даних? Утиліта `strings` в Linux ідеально підходить для видобування цих текстових фрагментів, які називаються “рядками”.

Linux пропонує безліч інструментів командного рядка, які можуть здаватися несподіваними рішеннями для певних задач. Команда `strings` є саме таким інструментом. Але яка її справжня мета? Чи є сенс в команді, яка просто виводить рядки з двійкового файлу?

Зробімо крок назад. Двійкові файли, такі як виконувані програми, можуть містити читабельні текстові рядки. Але як їх можна переглянути? Якщо спробувати використати `cat` або `less`, термінал, скоріш за все, відобразить незрозумілі символи. Інструменти, розроблені для роботи з текстовими файлами, погано справляються з недрукованими символами.

Велика частина байтів у двійковому файлі є нечитабельною та не може бути виведена на термінал в зрозумілому вигляді. Для двійкових значень, які не відповідають буквено-цифровим символам, знакам пунктуації чи пробілам, немає стандартних символів. Усі ці символи, що можна відобразити, називаються “друкованими”. Решта символів є недрукованими.

Таким чином, спроба пошуку текстових рядків у двійковому файлі є проблемою. Саме тут на допомогу приходить команда `strings`. Вона витягує послідовності друкованих символів з файлів, дозволяючи іншим командам використовувати ці рядки без необхідності мати справу з недрукованими символами.

Застосування Команди `strings`

Команда `strings` є досить простою у використанні, і її основне застосування є дуже прямолінійним. У командному рядку ми вказуємо ім’я файлу, в якому потрібно шукати рядки.

Наприклад, ми будемо використовувати `strings` на двійковому файлі – виконуваному файлі з назвою “jibber”. Введемо `strings`, потім пробіл, потім “jibber” і натиснемо Enter.

strings jibber

Рядки будуть витягнуті з файлу та відображені у вікні терміналу.

Встановлення Мінімальної Довжини Рядка

За замовчуванням, `strings` шукає рядки, які мають довжину чотири символи або більше. Щоб задати іншу мінімальну довжину, використовуйте опцію `-n` (мінімальна довжина).

Слід зазначити, що чим коротша мінімальна довжина, тим вище ймовірність отримати більше “сміття”.

Деякі двійкові значення можуть мати те саме числове значення, що й значення друкованого символу. Якщо два таких значення розташовані поруч у файлі, і ви вкажете мінімальну довжину два, ці байти будуть відображені як рядок.

Щоб задати мінімальну довжину в два символи, використовуйте наступну команду:

strings -n 2 jibber

Тепер у результатах є двосимвольні рядки. Зверніть увагу, що пробіли також вважаються друкованими символами.

Перенаправлення Виводу `strings` через `less`

Оскільки вивід команди `strings` може бути довгим, краще перенаправити його до команди `less`. Це дозволить переглядати файл, прокручуючи його та шукаючи цікаві рядки.

strings jibber | less

Список рядків буде показано у вікні програми `less`, починаючи з початку.

Застосування `strings` до Об’єктних Файлів

Зазвичай, вихідний код програми компілюється в об’єктні файли. Потім вони компонуються з файлами бібліотек для створення виконуваного файлу. У нас є об’єктний файл “jibber.o”, тож давайте поглянемо на нього. Зверніть увагу на розширення файлу “.o”.

jibber.o | less

Перший набір рядків виводиться у вісім стовпців, якщо їхня довжина перевищує вісім символів. Якщо рядок було перенесено, то в дев’ятому стовпці з’явиться символ “H”. Ці рядки можна ідентифікувати як оператори SQL.

Прокручуючи далі, можна побачити, що це форматування застосовується не до всього файлу.

Цікаво порівняти текстові рядки об’єктного файлу та готового виконуваного файлу.

Пошук у Певних Ділянках Файлу

Скомпільовані програми містять різні області, які використовуються для зберігання тексту. За замовчуванням, `strings` шукає текст у всьому файлі. Це еквівалентно використанню опції `-a` (all). Щоб `strings` шукала лише в ініціалізованих розділах даних файлу, використовуйте опцію `-d` (data).

strings -d jibber | less

Якщо немає особливої потреби, можна використовувати налаштування за замовчуванням і шукати по всьому файлу.

Виведення Зміщення Рядків

Можна налаштувати `strings` для виведення зміщення кожного рядка від початку файлу. Для цього використовуйте опцію `-o` (offset).

strings -o parse_phrases | less

Зміщення виводяться у вісімковій системі числення.

Щоб зміщення відображалося в іншій системі числення, наприклад, десятковій чи шістнадцятковій, використовуйте опцію `-t` (radix). За опцією основи має слідувати `d` (десяткова), `x` (шістнадцяткова), або `o` (вісімкова). Використання `-to` еквівалентно використанню `-o`.

strings -t d parse_phrases | less

Тепер зміщення відображаються в десятковій системі.

strings -t x parse_phrases | less

Зміщення тепер відображаються в шістнадцятковому форматі.

Включення Пробілів

`strings` вважає символи табуляції та пробілу частиною знайдених рядків. Інші пробільні символи, такі як новий рядок і повернення каретки, не вважаються частиною рядків. Опція `-w` (whitespace) змушує `strings` вважати всі пробільні символи частинами рядків.

strings -w add_data | less

У виводі є порожній рядок, який є результатом (невидимих) символів повернення каретки та нового рядка в кінці другого рядка.

Не Обмежуємося Лише Файлами

Команда `strings` може бути застосована до всього, що є потоком байтів або може його згенерувати.

За допомогою наступної команди ми можемо переглянути оперативну пам’ять (RAM) нашого комп’ютера.

Необхідно використовувати `sudo`, оскільки ми отримуємо доступ до `/dev/mem`. Це файл символьного пристрою, який містить образ оперативної пам’яті нашого комп’ютера.

sudo strings /dev/mem | less

Список не є повним вмістом оперативної пам’яті. З неї витягуються лише рядки.

Пошук у Декількох Файлах Одночасно

Для вибору груп файлів для пошуку можна використовувати символи підстановки. Символ `*` представляє декілька символів, а `?` – будь-який окремий символ. Також можна вказати кілька імен файлів у командному рядку.

Застосуємо символ підстановки та виконаємо пошук у всіх виконуваних файлах у каталозі `/bin`. Оскільки список міститиме результати з багатьох файлів, ми використаємо опцію `-f` (filename). Це виведе ім’я файлу на початку кожного рядка. Таким чином ми зможемо дізнатися, в якому файлі знайдено кожен рядок.

Перенаправимо результат до grep та виконаємо пошук рядків, що містять слово “Copyright”.

strings -f /bin/* | grep Copyright

Ми отримаємо список заяв про авторські права для кожного файлу в каталозі `/bin`, з ім’ям файлу на початку кожного рядка.

`strings`: Розкрито

Команда `strings` не має ніякої таємниці; це типова утиліта Linux. Вона виконує дуже конкретну задачу та робить це дуже добре.

Це ще один “гвинтик” у системі Linux, який стає дійсно корисним, коли працює в поєднанні з іншими командами. Розуміючи, як вона може бути використана між двійковими файлами та іншими інструментами, як `grep`, починаєш цінувати її функціональність.