修改 tar 存档内文件的文件所有权

修改 tar 存档内文件的文件所有权

我正在以用户身份工作,我想创建一个 tar 存档,当解压(由 root)时,它将以 root 所有权提取其文件(否则 root 必须在提取文件后手动更改每个文件的所有权)到达目的地)。

我发现fakeroot这似乎正是这样做的。但我无法找到创建存档所需的语法。

如何创建 tar.xz 存档,以便文件在由 root 解压时具有 root 所有权?

do something with fakeroot ...
tar cfpJ foo.tar.xz foo/

答案1

如何创建 tar.xz 存档,以便文件在由 root 解压时具有 root 所有权?

这取决于解压的 root:

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

如果你想让它们全部从 root 开始,你可以使用

tar --owner=root --group=root -cf ...

答案2

假根

假根实用程序,或较新的实用程序fakeroot-ng(相同的目的,不同的实现技术)运行一个程序并向该程序假装它正在以 root 身份运行并且系统调用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,那么命名空间是创建假装 root 环境的另一种方法。用户层支持尚未完成,因此我不会详细介绍。

挂载存档

解决问题的另一种方法是将存档安装为目录。您可以使用存档挂载,它能够通过修改多种存档格式自由档案库,包括压缩焦油。

mkdir mnt
archivemount foo.tar.xz mnt
chown root:root mnt/usr/bin/foo
fusermount -u mnt

相关内容