Технологічне
23 Oct 2016 12:28![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Я вчора промудохався півдня, відловлюючи бридкий і складний баг.
Почалось все з того, що в мене перестала працювати скриптова система керування серваком. Видавало щось отакого типу:

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

Відкриваю у `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 замість #!, інтерпретатору команд стає трохи зле.
Ми всі чудово знаємо, в якій осі екзекутабельність файла визначається не пермішнами, а розширенням, і де такі неявні фокуси із вмістом файлів можуть минати безкарно. От тепер скажіть, що мені даремно хочеться повідривать їм ноги і дать цими ногами по голові!

(no subject)
Date: 23 Oct 2016 10:35 (UTC)(no subject)
Date: 23 Oct 2016 15:07 (UTC)(no subject)
Date: 23 Oct 2016 15:57 (UTC)(no subject)
Date: 23 Oct 2016 16:09 (UTC)(no subject)
Date: 23 Oct 2016 23:04 (UTC)the interpretation of shebang lines is done by a kernel. the shell itself has nothing to do w/ it.
(no subject)
Date: 28 Oct 2016 08:07 (UTC)(no subject)
Date: 29 Oct 2016 14:36 (UTC)У випадку FreeBSD, якщо мені не зраджує маразм, коли /bin/sh не може визначити метод запуску екзекутабла, він вважає його скриптом для себе, і форкає екземпляр себе, який і виконує команди в скрипті одна за одною:
(no subject)
Date: 29 Oct 2016 15:00 (UTC)svnweb.freebsd.org/base/stable/11/bin/sh/exec.c?view=markup
and similarly to bash, it looks for the NULL char to decide if it should try another execve run!
btw, the code is *much* more readable compared to bash. fbsd can be so cute!
PS
glad you liked the text
(no subject)
Date: 29 Oct 2016 15:32 (UTC)(no subject)
Date: 29 Oct 2016 16:00 (UTC)I was an avid fbsd user, but eventually got tired of constantly broken ruby gems that were (are) tested on osx/linux only, npm pkgs that regularly failed to compile under fbsd, etc. perhaps fbsd is still fine for network engineers or if you work for a big fbsd shop.
I suspect if not for its permissive license (as compared to that gnu/linux nonsense), fbsd would have been dead by now.
(no subject)
Date: 29 Oct 2016 16:07 (UTC)(no subject)
Date: 29 Oct 2016 15:11 (UTC)(no subject)
Date: 29 Oct 2016 15:16 (UTC)(no subject)
Date: 28 Oct 2016 07:31 (UTC)hexdump, hd — ASCII, decimal, hexadecimal, octal dump
Например, hexdump -C filename
(no subject)
Date: 28 Oct 2016 07:36 (UTC)(no subject)
Date: 28 Oct 2016 08:03 (UTC)(no subject)
Date: 28 Oct 2016 08:08 (UTC)