kondybas: (100 - мои пять копеек...)
kondybas ([personal profile] kondybas) wrote2016-10-23 12:28 pm

Технологічне


Я вчора промудохався півдня, відловлюючи бридкий і складний баг.

Почалось все з того, що в мене перестала працювати скриптова система керування серваком. Видавало щось отакого типу:

Відкриваю катом. Нє, всьо ок:

Відкриваю у `ee` - фєншуйчик!

Ну, думаю, відкрию редактором `le`! А там все теж зашибись:

Відкриваю у встроєному редакторі `deco` - і знов невдача!

Ах, ти ж! - думаю, а єслі у вінді? Перекидаю у FAR - благолєпіє повне:

А шо ще в мене є під рукою? Ага! Ще більш-менш є more-less! Ага, спіймався, падлюка!

Ну, і канєшно ж у `vi` цю холєру вдалося ампутувати:


Після недовгого гугління з'ясувалась причина. Деякі редактори зберігаючи файло у кодуванні 65001 ака UTF8, пхають у перші два байти файлу т.зв. BOM - byte order marker. U+FEFF. Big-endian, little-endian - вот єто вот всьо, вся ета русофобія. Ідея в тому, щоб натикаючись на файло, текстові процесори розуміли, з чим мають справу. Як бачимо, більшість редакторів розуміє це добре, навіть не виводячи цей службовий символ на табло.

Проблема ж в тому, що криворукий тупоголовий уєбан, що вигадав це "покращення", й гадки не мав, що в ніксах текстові файли можуть бути скриптами. І що спецом для цього діла перші два байти кожного скрипта починаються з магічної сигнатури 'шебанг' - #!
Інтерпретатор команд, бачучи ці чарівні символи, читає строчку до кінця, а там має бути прописаний шлях до інтерпретатора тієї скриптової мови, якою написаний наш скрипт. Вигляда це все як `#!/bin/sh`, `#!/usr/local/bin/perl` або `#!/usr/local/bin/php`. Ясний пень, що бачучи во пєрвих строках моєво пісьма FEFF замість #!, інтерпретатору команд стає трохи зле.

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

[identity profile] click0.livejournal.com 2016-10-28 07:31 am (UTC)(link)
Очень полезная утилитка
hexdump, hd — ASCII, decimal, hexadecimal, octal dump

Например, hexdump -C filename

[identity profile] kondybas.livejournal.com 2016-10-28 07:36 am (UTC)(link)
Та в хексі подивитись не проблема. Проблема в тому, що ідея псування текстового файлу, та ще й у неочевидний і не відображуваний більшістю редакторів спосіб - занадто нетривіальна, аби локалізувати проблему. В той момент, коли я зрозумів, що проблема саме у невідображуваних символах, інструмент вже не був проблемою. Але дійти думки про підміну сигнатури я мусив аналітично, без хекс-редакторів тощо. В цьому була складність проблеми.

[identity profile] click0.livejournal.com 2016-10-28 08:03 am (UTC)(link)
А еще есть truss и ktrace :)

[identity profile] kondybas.livejournal.com 2016-10-28 08:08 am (UTC)(link)
Ну от я якось не дійшов до рівня трасування системних викликів :) Трошки раніше настало прозріння.