изменить владельца файла для файлов внутри архива tar

10

Я работаю как пользователь, и я хотел бы создать архив tar, который при распаковке (по корню) будет извлекать свои файлы с правами суперпользователя (в противном случае root должен был бы изменить владельца вручную для каждого файла после того, как файлы были извлечены) к месту назначения).

Я нашел, fakerootкоторый, кажется, делает именно это. Но я не могу найти синтаксис, который мне нужно использовать для создания моего архива.

Как я могу создать архив tar.xz, чтобы файлы имели права root при распаковке root?

do something with fakeroot ...
tar cfpJ foo.tar.xz foo/
user1968963
источник

Ответы:

12

Как я могу создать архив tar.xz, чтобы файлы имели права root при распаковке root?

Это до рута, который распаковывает:

tar --no-same-owner -xf ...

Если вы хотите, чтобы все они были root, вы можете использовать

tar --owner=root --group=root -cf ...
лютик золотистый
источник
это не работает для меня: tar --owner=root --group=root cfpJ files.tar.xz files/дает мне ошибку tar: You must specify one of the -Acdtrux 'или --test-label' options Try tar --help' илиtar --usage' for more information.
user1968963
Вам нужна -строка перед вашими короткими опциями: tar --owner=root --group=root -cfpJ ...Т.е. -cfpJнет cfpJ.
Златовласка
tar --owner=root --group=root -cfpJ files.tar.xz files/дает мне еще одну ошибку: tar: files.tar.xz: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errorsи более того, он создает файл с именем pJ.
user1968963
3
Ладно. Я всегда ставлю fв конце (потому что это имеет больше смысла, интуитивно понятно) и низко, и вот, я получаю ту же ошибку с -cfpJНО -cpJfработами.
Златовласка
@ user1968963: f всегда должен быть перед именем файла, так как это означает, что «следующим параметром является имя файла». Если вы не поместите его непосредственно перед именем файла, tar подумает, что имя файла "", а затем попытается открыть файл "", который он не может определить (конечно).
Оливье Дюлак
8

Fakeroot

Fakeroot утилита или более новая утилита fakeroot-нг ( той же цели, другой метод реализации) запускает программу и делает вид программы , что он работает как корень , и что системные вызовы , такие , как chownудалось. Только программа считает, что эти вызовы выполнены успешно, на самом деле ничего не отражается в файловой системе (это не может быть, поскольку не fakerootимеет никаких дополнительных привилегий). Однако, если программа меняет владельца файла, а затем предпринимает некоторые действия, основанные на владении этим файлом, это может изменить поведение программы.

Типичный способ получить полезную работу из fakeroot, запустив среду fakeroot, где происходит следующее:

  1. Создавайте некоторые файлы, перемещайте их, меняйте их владельцев и режимы и т. Д.
  2. Создайте архив этих файлов.

Пример:

fakeroot sh -c '
    chown root:root usr/bin/foo
    tar cf foo.tar usr
'

Вам нужно использовать один вызов fakeroot, так как между вызовами нет памяти.

Пространства имен Linux

Просто для полноты, я упомяну, что если у вас ядро ​​Linux ≥3.8, то пространства имен - это еще один способ создать среду притворного корня. Поддержка пользователей еще не совсем готова, поэтому я не буду вдаваться в подробности.

Смонтировать архив

Другой способ решить вашу проблему - это смонтировать архив как каталог. Вы можете использовать archivemount , который способен изменять несколько форматов архивов через libarchive , включая сжатый tar.

mkdir mnt
archivemount foo.tar.xz mnt
chown root:root mnt/usr/bin/foo
fusermount -u mnt
Жиль "ТАК - перестань быть злым"
источник
Хороший трюк archivemount, но он все еще требует повышения привилегий, и даже если пользователь находится в доверенной группе, которой разрешено монтировать и размонтировать, процесс завершается неудачно chown, поэтому необходимо использовать какие-то сторонние инструменты, такие как fakerootили пространства имен , тоже.
Антон Самсонов