Вопрос или проблема
У tar есть несколько опций, чтобы повлиять на то, как будет храниться владение файлами и каталогами в этом tar-файле. Например, –numeric-owner или –owner-map. Эти опции напрямую влияют на то, как будет извлечен tar-файл, или что будет сделано при извлечении, если мы выполняем извлечение от имени root.
- Без опций tar найдет соответствующую группу/пользователя в текущей системе и установит владение на эту группу/пользователя, даже если uid/gid отличаются от тех, что были при создании архива.
- С помощью –numeric-owner извлечение всегда установит uid/gid такими же, как они были при создании архива.
- С помощью –owner-map мы можем предоставить собственное сопоставление для пользователей/uid, но только при создании архива. Использование этой опции ничего не делает при извлечении архива.
Эти опции отличные, но мне нужно иметь возможность влиять на то, что tar делает с владением при извлечении, в момент, когда я извлекаю архив, а не когда я его создаю. –owner-map казалась мне идеальным решением, пока я не обнаружил, что она ничего не делает, если ее использовать при извлечении.
Поэтому мой вопрос таков: Можно ли как-то контролировать, с каким владением tar будет извлекать файлы и каталоги в момент извлечения архива?
Я не нашел ничего подходящего. В качестве решения я попытался создать окружение chroot с /etc/passwd и /etc/group, которое обеспечивало бы правильное сопоставление, а затем извлечь tar-архив в chroot, но это не сработало. Я предполагаю, что chroot все равно берет пользователей и группы из хост-системы, однако мне кажется, что это может привести к решению.
Я буду признателен за любую помощь или идеи, даже если они будут не совсем стандартными (думаю, что замена /etc/passwd и /etc/group в системе, в которой я извлекаю, сработает, но это для меня неприемлемо).
Когда вы извлекаете файлы от имени root, tar
по умолчанию будет использовать оригинальное владение.
Вы можете переопределить это, используя опцию --no-same-owner
(или -o), чтобы создать файлы, принадлежащие пользователю, который запустил tar
.
Если вы хотите извлечь от имени другого пользователя, вам нужно стать этим пользователем, используя su
, и извлечь с опцией --no-same-owner
.
После нескольких дополнительных экспериментов с tar я осознал, что tar –numeric-owner оказывает влияние не только при архивировании, но и при извлечении (в отличие от –owner-map и –group-map). К счастью для меня, при извлечении мне нужно только выбирать между ID оригинальной системы и ID текущей системы. Поэтому, когда мне нужны ID из оригинальной системы, я использую –numeric-owner, а когда мне нужны ID из текущей системы, нет.
Если кто-то сталкивается с аналогичной проблемой, кажется, что find
можно использовать для изменения всех uid и gid за один проход. Таким образом, это, вероятно, окажется эффективным решением. Например (можно заменить критерий -name на -user или -group):
$ find . -name "a" -exec echo chown userA {} + -o -name "b" -exec echo chown userB {} +
chown userA ./a ./test2/a ./test3/a
chown userB ./b
Можно ли как-то контролировать, с каким владением tar будет извлекать файлы и каталоги в момент извлечения архива?
Я буду признателен за любую помощь или идеи, даже если они будут не совсем стандартными (думаю, что замена /etc/passwd и /etc/group)
Ух! Это не нестандартно, а крайне неудобно. Хакер бы модифицировал tar (утилиту), чтобы реализовать эту функцию, или написал бы потоковый фильтр для tar (формата), чтобы в режиме реального времени переписывать пользователей:группы в нем.
К счастью, если вы хотите статической переустановки владения, вам не нужно делать ни одно из этих действий. Уже существует утилита, такая же как venerable tar(1), которая предлагает именно это — cpio(1):
# cpio -idm --owner user:group < .tar
Однако обратите внимание, что она не обнаружит сжатый ввод и не вызовет декомпрессор автоматически, как это делает tar(1), так что используйте, например:
# zcat .tar.gz | cpio -idm --owner user:group
при необходимости.
Я также бы предложил всем, кого это беспокоит, подать запрос на добавление функции на [email protected], указав на этот факт — что tar(1) не хватает функции, которую имеет менее сложный пакет cpio(1) (на самом деле они разделяют весь тяжелый код).
Ответ или решение
Управление правами собственности при извлечении архивов tar
Когда речь идет о работе с архивами tar, управление правами собственности файлов и директорий является ключевым аспектом, особенно в контексте безопасности и соответствия политики. Существует несколько опций, которые влияют на то, как информация о владельцах файлов будет сохраняться и обрабатываться при создании и извлечении архивов.
Основные опции tar
-
Без опций: При извлечении архива tar по умолчанию права собственности будут устанавливаться в соответствии с текущей системой. Это означает, что tar будет искать соответствия между идентификаторами пользователей (UID) и групп (GID) в архиве и на вашей машине. Как результат, если UID и GID отличаются от тех, что были при создании архива, владельцы файлов будут изменены на значения, существующие в вашей системе.
-
--numeric-owner
: Эта опция сохраняет оригинальные UID и GID, которые были присвоены при создании архива, независимо от существующих пользователей и групп на целевой системе. Это означает, что при извлечении архива права собственности будут равняться тем, которые были в момент его создания, даже если на текущей системе они не соответствуют. -
--owner-map
: Этот флаг предназначен для создания собственного отображения пользователей и групп, но, к сожалению, он не применяется при извлечении архива. Это ограничение делает его менее полезным для задачи, связанной с изменением прав собственности уже в процессе извлечения.
Проблема контроля прав собственности при извлечении
Проблема, с которой вы столкнулись, касается необходимости управления правами собственности при извлечении архивов, что не может быть достигнуто только с помощью опций tar. Вы правильно отметили, что использование --owner-map
не принесло желаемых результатов, так как эта опция не работает во время извлечения.
Возможные решения
-
Использование опции
--no-same-owner
: Если вы хотите извлекать файлы с владельцем, отличным от оригинального, вы можете воспользоваться этой опцией, которая создаст файлы с правами владельца текущего пользователя, запустившего команду tar. Это может быть полезно в ситуациях, когда вам не важен оригинальный владелец файлов. -
Создание среды chroot: Вы одобряете использование chroot для создания изолированной среды с необходимыми файлами
/etc/passwd
и/etc/group
. Однако, как вы заметили, это решение может быть неэффективным, поскольку chroot все равно будет использовать информацию о пользователе и группе из хоста. Надежно изменить это может быть сложно и требует тщательной настройки системы. -
Решение с использованием
cpio
: Как один из возможных вариантов, можно использовать утилиту cpio, которая поддерживает указание прав собственности при извлечении. Команда:cpio -idm --owner user:group < .tar
позволяет указать конкретных пользователей и группы, которые будут назначены извлекаемым файлам.
-
Использование
find
для последующего изменения прав: Вы также можете использовать командуfind
для массового изменения владельцев и групп уже после извлечения файлов, что могут быть полезным подходом для немедленной коррекции прав:find . -name "example" -exec chown newuser:newgroup {} +
Заключение
В целом, управление правами собственности при работе с tar может быть сложным из-за ограничений существующих опций. Тем не менее, с помощью комбинации существующих инструментов, таких как cpio и find, а также стратегического подхода с использованием возможностей командной строки Linux, вы сможете эффективно контролировать права собственности как при создании, так и при извлечении архивов. Если у вас возникли дополнительные вопросы или потребовались разъяснения по конкретным методам, не стесняйтесь обращаться за помощью.