Заставить владельца и группу для содержимого файла tar?

21

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

Вот направление, которое я пробовал:

tar ca --owner='otherowner' --group='othergroup' mydata.tgz mydata

И при выполнении этой команды я получаю следующую ошибку:

tar: otherowner: Invalid owner
tar: Error is not recoverable: exiting now

Есть ли способ заставить tar принять владельца: группу, даже если ни один из них не существует в системе, из которой создается файл?

Дэвид
источник
1
Обратите внимание, что --owner не поддерживается параметром tar. Это непереносимый GNUism. Для star вы, например, используете встроенную функцию find и задаете -chown username / userid -chgrp groupname / groupid.
Шили

Ответы:

19

В Linux используются не внутренние имена владельцев и групп, а номера - UID и GID. Имена пользователей и групп сопоставлены с содержимым файлов / etc / passwd и / etc / group для удобства пользователя. Поскольку у вас нет записи «otherowner» ни в одном из этих файлов, Linux фактически не знает, какие UID и GID должны быть назначены файлу. Давайте попробуем передать число вместо:

$ tar cf archive.tar test.c --owner=0 --group=0
$ tar -tvf archive.tar 
-rw-rw-r-- root/root        45 2013-01-10 15:06 test.c
$ tar cf archive.tar test.c --owner=543543 --group=543543
$ tar -tvf archive.tar 
-rw-rw-r-- 543543/543543    45 2013-01-10 15:06 test.c

Вроде работает.

Nykakin
источник
Интересный! Таким образом, команда tar должна опрашивать систему, чтобы номера пользователей и групп соответствовали именам, которые я пытался использовать. Благодарность!
Дэвид
1
Примечание для других, кто сталкивался с этим: tar автоматически выводит имена пользователей / групп при использовании -tvfфлагов. Чтобы просмотреть текущие номера файлов в архиве, используйте команду, подобную этой:$ tar --numeric-owner -tvf archive.tar
David
На самом деле с моей версией tar я могу ввести любое имя пользователя и сохранить его в файле tar (но с моим числовым идентификатором пользователя по умолчанию). При выводе списка вы получаете имена пользователей по умолчанию, но идентификаторы пользователей с использованием --numeric-ownerфлага. Что еще интереснее, вы можете установить оба с помощью --owner=name:1234или --group=groupname:4711. Источник: функция parse_owner_group исходного кода tar
Bluehorn
Вероятно, стоит отметить, что заголовок tar ustar (стандарт для BSD и Linux) кодирует как числовые значения UID / GID, так и имена пользователей и групп. При распаковке сначала используются имена, если они присутствуют в заголовке и соответствуют пользователям и группам, определенным в системе. Числовой UID и GID будут использоваться только как запасной вариант.
Кболино
1

Добавьте параметры --no-same-owner --no-same-permissionsс tar. Посмотрите на документы .

Бруно Вего
источник
2
Эти параметры используются только при извлечении файлов из архива tar, но не при его создании.
Энтони Дж. - справедливость для Моники
Вы правы @AnthonyGeoghegan!
Бруно Уего
-2

Вот фрагмент кода для замены пользователя / группы на id на лету:

tar ca --owner="$(id -u ***otherowner***)" --group="$(id -g ***othergroup***)" mydata.tgz mydata
poussma
источник
5
Нет. Если id знает, как определить имя, tar тоже знает. Вопрос касается имени пользователя, неизвестного системе.
Даниэль С