提取时 tar 所有者图

提取时 tar 所有者图

Tar 有几个选项可以影响文件和目录所有权在该 tar 文件中的存储方式。例如 --numeric-owner 或 --owner-map。这些选项直接影响 tar 文件的提取方式,或者假设我们以 root 身份运行提取时将执行的操作。

  • 如果没有选项,tar 将在当前系统中找到相应的组/用户,并将所有权设置为该组/用户,即使 uid/gid 与创建档案时的不同。
  • 使用 --numeric-owner 时,提取将始终将 uid/gid 设置为与我们创建档案时相同的值
  • 使用 --owner-map,我们可以为用户/uid 提供自己的映射,但仅限于创建档案时。提取档案时使用此选项不会执行任何操作。

这些选项很棒,但我需要能够在提取档案时影响 tar 对所有权的处理,而不是在我创建档案时。 --owner-map 对我来说似乎是一个完美的解决方案,直到我发现在提取时提供它时它什么也不做。

所以我的问题是:当我们提取档案时,是否有可能以某种方式控制 tar 将使用什么所有权来提取文件和目录?

我找不到任何相关内容。作为解决方案,我尝试使用 /etc/passwd 和 /etc/group 创建 chroot 环境以确保正确映射,然后在 chroot 下提取 tar 存档,但没有成功。我认为这是因为 chroot 仍然以某种方式从主机系统中获取用户和组,但感觉这可以解决问题。

我将不胜感激任何形式的帮助或想法,即使它们是黑客行为(我认为在我正在提取的系统中替换 /etc/passwd 和 /etc/group 会起作用,但这对我来说是不可接受的)。

答案1

以 root 身份提取文件时,tar默认将使用原始所有权。

您可以使用选项(或者 -o)覆盖该--no-same-owner选项,以创建启动用户所拥有的文件tar

如果您希望以其他用户身份提取,则需要成为该用户,使用su,然后使用选项进行提取--no-same-owner

答案2

在对 tar 进行几次实验后,我意识到 tar --numeric-owner 不仅在存档时有效,在提取时也有效(与 --owner-map 和 --group-map 不同)。幸运的是,在提取时,我只需要能够在原始系统的 ID 和当前系统的 ID 之间进行选择。因此,当我需要原始系统的 ID 时,我会使用 --numeric-owner,而当我需要当前系统的 ID 时,我不会使用。

如果有人偶然发现类似的问题。似乎find可以用它来一次性更改所有 uid 和 gid。因此,它可能被证明是一种有效的解决方案。例如。(可以用 -user 或 -group 标准替换 -name 标准)

$ find . -name "a" -exec echo chown userA {} + -o -name "b" -exec echo chown userB {} +
chown userA ./a ./test2/a ./test3/a
chown userB ./b

相关内容