Чи безпечно використовувати стандартні вхідні та вихідні дані з бінарними даними?


14

Мені потрібно розділити двійковий файл на два. Мені було цікаво, чи можна використовувати голову та / або хвіст, але тоді я задумався ... чи безпечно використовувати перенаправлення, трубопроводи тощо з бінарними даними? Чи заплутуються нові рядки, чи нульові ігноруються, чи повертаються назад, чи видаляються чимось особливим? (bash, kubuntu 18.04 LTS)


1
Погляньте на splitкоманду.
Егмонт

Відповіді:


19

Так, це безпечно, якщо ви передаєте його в інший процес або зберігаєте у файл. Існує потенційна "дивацтво", якщо ви дозволите друкувати бінарний stdout до терміналу, оскільки він може містити послідовності втечі (навмання), які можуть тимчасово зірвати дисплей терміналу.


6
У цьому випадку ви можете ввести resetта натиснути клавішу Enter, щоб виправити це.
Баард Копперуд

4
@BaardKopperud Я думав, що я десь читав про деякі кутові випадки, коли tset / reset не працюватиме
Xen2050

1
@ Xen2050 Я не знаю. єдиний випадок, який трапиться, якщо якась послідовність евакуації змінить розкладку / кодування клавіатури, так що введення reset<enter> фактично не
вводить

3
Дивіться також Фікс терміналу після виведення двійкового файлу і Чому необхідності консолі іноді після перезавантаження CTRL + C . Як запропоновано в першому посиланні, stty sane; tput rs1послідовність команд виконає трюк, коли є кутові випадки resetнепрацюючого. Такі випадки, окрім згаданого Бакуріу, можуть включати ширину кінцевої лінії / стовпців або я здогадуюсь про налаштування, пов'язані з послідовним зв’язком (боудрат / паритет).
Сергій Колодяжний

1

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

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

Якщо ви знаєте структуру файлу, ви можете використовувати таку команду, як

dd -if input-file -of output-file ...

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

Схоже, що splitкоманда, як згадує @egmont, автоматизує цей процес для вас, але, здається, за замовчуванням орієнтована на рядки, тому вам доведеться вказати додаткові параметри, наприклад, --bytes countсказати, наскільки має бути кожен фрагмент файлу бути.


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

strings -n 6 file | less

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

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

strings є варіант -t x який передуватиме кожному надрукованому рядку з його зміщенням у файл шістнадцятковим (o для восьмеричного / d для десяткового), щоб ви знали, де його знайти пізніше. Навіть дуже короткі файли мають багато чого впоратися, коли доводиться дивитися на них за характером.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.