我想创建一个 tar 文件,其中的内容属于所有者:组对,而创建该文件的系统上不存在该所有者:组对。
这是我尝试过的方向:
tar ca --owner='otherowner' --group='othergroup' mydata.tgz mydata
当运行此命令时,我收到以下错误:
tar: otherowner: Invalid owner
tar: Error is not recoverable: exiting now
有没有办法强制 tar 接受所有者:组,即使它们都不存在于创建文件的系统上?
答案1
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
似乎有效。
答案2
添加参数--no-same-owner --no-same-permissions
与tar
.采取一个查看文档。
答案3
tar 存档可以存储用户和组的名称和数字 ID(尽管我不确定这是否适用于所有可能的 tar 格式风格)。
GNU tar 接受两个选项,--user=USER
并--group=GROUP
为文件设置用户和组。
USER
和都GROUP
可以通过其名称、数字 ID 或两者(以 形式NAME:ID
)指定。
除非明确指定名称和 ID,否则将通过查看本地系统上的用户/组来填充缺少的部分。由于您的系统上没有指定的用户otherowner
,因此 tar 不知道要为该文件分配什么 UID。
指定选项应该--owner=otherowner:1000 --group=othergroup:1000
可以解决问题。
答案4
下面是一段用 ids 动态替换用户/组的代码:
tar ca --owner="$(id -u ***otherowner***)" --group="$(id -g ***othergroup***)" mydata.tgz mydata