Shar
В операционной системе Unix формат shar (англ. shell archive — архив оболочки) — это формат архива, созданный с помощью утилиты shar Unix. Файл shar объединяет файлы в один сценарий оболочки и представляет собой тип самораспаковывающегося архива, поскольку он является допустимым сценарием оболочки, выполнение которого приводит к пересозданию файлов. Для извлечения файлов обычно требуется только стандартная оболочка Unix Bourne sh. Файлы shar также иногда называют sharchives (от «/bin/sh archive»)[1]. В российских статьях используется и другой термин — архив интерпретатора команд[2].
Команда shar не указана в Единой спецификации Unix, поэтому формально она не является компонентом Unix, а является устаревшей утилитой.
Этот формат кодирует файлы в текстовый сценарий, который можно запустить в Unix-подобной системе для воссоздания исходных файлов. Формат shar широко использовался в ранний период существования Unix для распространения программного обеспечения и совместного использования файлов, особенно по электронной почте или в Usenet. Позднее он в значительной степени был вытеснен более современными форматами, такими как tar и zip, но остался важным историческим форматом в экосистеме Unix, и ценится за свою простоту и возможность создавать и извлекать файлы с помощью базовых команд оболочки[4].
Что важно знать
| shar | |
|---|---|
| Тип | Команда (информатика) |
| Автор | Гослинг, Джеймс |
| Разработчики | Различные разработчики открытого программного обеспечения и коммерческие разработчики |
| Операционные системы | Unix, Unix-like, VMS, Windows |
| shar | |
|---|---|
| Расширение |
.shar |
| Разработчик | Джеймс Гослинг[3] |
| Тип формата | Архиватор, Сценарий командной строки |
История
Известный канадский программист Джеймс Гослинг считается автором первой версии утилиты shar, написанной в 1982 году[5], также он написал ранний пример этой концепции в виде простого сценария оболочки (предположительно в 1978–1979 годах)[6][7].
- 1980-е годы: shar появился как удобный метод объединения файлов в единый сценарий для распространения в системах Unix. Это было особенно полезно в средах, где электронная почта и Usenet были основными средствами обмена программным обеспечением и файлами.
- Начало 1990-х годов: по мере роста использования Интернета shar продолжал оставаться популярным форматом для распространения файлов по электронной почте, а его простой текстовый формат легко передавался по ранним сетям.
- Середина 1990-х: появление более продвинутых форматов архивов, таких как tar, в сочетании с инструментами сжатия, такими как gzip, привело к снижению использования shar, хотя он продолжал использоваться для простого текстового распространения.
- 2000-е годы: shar стал более ограниченным нишевым форматом, в основном используемым в определённых сообществах Unix. Простота создания и совместимость с основными командами оболочки делали его пригодным для определённых задач[4].
Архивы shar считаются устаревшим форматом и редко используются в распространении программного обеспечения. Их всё ещё можно встретить в архивах программного обеспечения или в редких нишевых ситуациях, где требуется совместимость с очень старыми системами, но они в значительной степени вытеснены более эффективными и надёжными методами архивирования. Основные причины снижения популярности использования архивов shar[4]:
- Ограниченная функциональность. В архивах shar отсутствуют функции современных форматов архивов, такие как сжатие, обработка ошибок и сохранение метаданных.
- Проблемы безопасности. Являясь сценариями оболочки, файлы shar потенциально могут содержать вредоносный код, что представляет угрозу безопасности.
- Эффективность. По сравнению с новыми форматами shar , как правило, менее эффективен с точки зрения скорости хранения и извлечения.
- Появление лучших альтернатив. Такие форматы, как ZIP, tar, 7-Zip, обеспечивают превосходную производительность, безопасность и функциональность, что делает их предпочтительным выбором для большинства пользователей.
Хотя shar в значительной степени заменён современными форматами архивов, он по-прежнему известен своей ролью в истории Unix и иногда используется в устаревших системах или в образовательных целях.
Структура архива
Обзор структуры типичного shar архива[4]:
- Заголовок: обычно включает комментарии об архиве, такие как дата создания, автор и описание содержимого. В этом разделе также могут быть инструкции по распаковке архива.
- Директивы файла:
- Каждый файл в архиве shar представлен серией команд оболочки. Эти команды обычно начинаются с команд echo или cat, которые записывают содержимое файла в соответствующие места в системе. Файловые директивы также включают команды для установки корректных прав доступа к файлам с использованием команд chmod после создания каждого файла.
- Содержимое файла. Фактическое содержимое каждого файла включено в архив shar и обычно закодировано с использованием текстовых методов, таких как uuencoding. Это гарантирует, что двоичные файлы можно безопасно включать в архив и передавать в виде обычного текста.
- Структура каталогов: Если архив shar содержит каталоги, сценарий включает команды для создания этих каталогов с помощью команд mkdir перед извлечением в них файлов.
- Нижний колонтитул. Архив shar завершается нижним колонтитулом, который часто включает дополнительные комментарии, контрольную сумму или другие метаданные для проверки целостности извлечённых файлов. Нижний колонтитул также может содержать сообщение, указывающее на успешное завершение процесса извлечения.
Методы сжатия
Файлы shar по своей сути не включают в себя какие-либо методы сжатия внутри самого формата, однако его можно применять несколькими способами[4]:
- Несжатый: По умолчанию архивы shar представляют собой несжатые текстовые файлы, что делает их легко читаемыми и выполняемыми как сценарии оболочки. Этот подход сохраняет простоту и широкую совместимость, позволяя легко распаковывать файлы с помощью стандартных команд оболочки.
- Внешнее сжатие: Файлы shar можно сжимать с помощью внешних инструментов сжатия, таких как GZIP, BZIP2 или ZIP, после их создания. Это уменьшает общий размер файла для распространения или хранения, но требует распаковки перед выполнением архива shar. Например, файл shar может распространяться как файл .shar.gz или .shar.bz2.
- Сжатие после распаковки: В некоторых случаях архивы shar могут включать в сценарий команды для сжатия отдельных файлов после их извлечения. Это менее распространено, но может использоваться, когда в процессе распаковки необходимо сжать определённые файлы в архиве.
- Сочетание с tar: Хотя сам shar не включает сжатие, его можно объединить с архивом tar (который затем можно сжать) для создания .tar.shar.gz или аналогичного файла. Этот метод позволяет архивировать и сжимать большие коллекции файлов за один шаг.
Особенности
Достоинство shar как текстового формата не перекрывает рисков его использования, так как он является исполняемым файлом[8]; по этой причине более ранний и более общий формат файла tar обычно предпочтительнее даже для передачи текстовых файлов. Операционная система GNU предоставляет собственную версию shar в коллекции GNU Sharutils.
Недостаток самораспаковывающихся сценариев оболочки (любого вида, не только shar) заключается в том, что они могут зависеть от конкретной реализации программ; архивы оболочки, созданные с помощью ранних версий makeself[9], например, оригинальный установщик компьютерной игры Unreal Tournament для Linux, не запускаются в bash 3.x из-за изменения в том, как обрабатываются отсутствующие аргументы встроенной командыtrap.
Исполняемый код, присоединённый к архиву, может представлять собой полноценную программу распаковки. Так как существует вероятность выполнения кода распаковщика, самораспаковывающийся архив или замаскированный под него файл может использоваться для распространения вредоносного ПО.
Нередко встречаются сообщения о shell-архивах, представляющих опасность: такие shell-архивы удаляют все файлы и производят другие разрушительные действия. В связи с этим пользователям рекомендуется[2]:
- Всегда просматривать содержимое shell-архива перед его распаковкой. Убедиться в том, что он не принесёт вреда файлам, можно изучив (без углубления) программирование на языке Shell;
- Пользователю, зарегистрированному как root, нельзя распаковывать shell-архив, так как этом случае он никак не защищён от возможного ущерба.
Несмотря на то, что существует много программ, создающих shell-архивы (форматы которых могут отличаться друг от друга), правильно построенный shell-архив можно распаковать любым интерпретатором команд ОС UNIX (B-shell или K-shell)[2].
Файлы shar, помимо своей простоты, предлагают универсальный подход к распространению программного обеспечения и созданию резервных копий[4].
Варианты архивов shar
Ранний пример первой версии утилиты shar, написанной в 1982 году Джеймсом Гослингом, в виде простого сценария оболочки [6][7]:
# shar -- Shell archiver
AR=$1
shift
for i do
echo a - $i
echo "echo x - $i" >>$AR
echo "cat >$i <<'!Funky!Stuff!'" >>$AR
cat $i >>$AR
echo "!Funky!Stuff!" >>$AR
done
Известны следующие варианты shar[10]:
- shar 1.x (1982) Гослинга. Скрипт оболочки, является общественным достоянием.
- shar2 или xshar (1988) Уильяма Дэвидсена (англ. William Davidsen). Общественное достояние, программа на языке Cи.
- cshar (1984) Майкла А. Томпсона (англ. Michael A. Thompson) ) и Марка Смита (англ. Mark Smith), утеряна из-за битового гниения (англ. bitrot). Программа на языке Cи.
- cshar (1988) Рича Сальца (англ. Rich Salz), программа на языке Cи. Вероятно, повлияла на shar 3.49 .
- ccshar (1996), модификация для вывода csh - скрипта. Редко используется в Usenet.
GNU sharдоступен как отдельный пакет для Microsoft Windows в составе коллекции UnxUtils, включающей собственные порты Win32 распространённых утилит GNU Unix[11].
Похожие форматы
Версия той же концепции, но для операционной системы VMS, была написана в 1987 году Майклом Беднареком (англ. Michael Bednarek) из Мельбурнского института прикладных экономических и социальных исследований (англ. The Melbourne Institute of Applied Economic and Social Research) в виде скрипта DCL, VMS_SHAR.COM[12]. Позже эта версия поддерживалась и расширялась Джеймсом А. Греем (англ. James A. Gray) из корпорации Xerox[13], и Энди Харпером (англ. Andy Harper) из Королевского колледжа Лондона[14][15].
makeself — это скрипт оболочки, который генерирует самораспаковывающиеся tar-архивы ( *.run, application/x-makeself), используя ту же технику заголовков, что и скрипт оболочки. Использование tar исключает возможность непосредственного использования makeself в виде обычного текста, но улучшенное сжатие и другие функциональные возможности сделали его более популярным в XXI веке среди поставщиков программного обеспечения, стремящихся упаковывать программное обеспечение для Linux[16]. В последних версиях Makeself поддерживает сжатие с помощью XZ и контрольные суммы SHA-256 вместо традиционных gzip и MD5[17]. Первая версия была написана в 2000 году Стефаном Питером (англ. Stéphane Peter)[16][18].


