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

use*_*963 12 tar permissions files

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

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

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

do something with fakeroot ...
tar cfpJ foo.tar.xz foo/
Run Code Online (Sandbox Code Playgroud)

gol*_*cks 15

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

这取决于解包的根:

tar --no-same-owner -xf ...
Run Code Online (Sandbox Code Playgroud)

如果你想让它们都成为 root,你可以使用

tar --owner=root --group=root -cf ...
Run Code Online (Sandbox Code Playgroud)

  • 好的。我总是把 `f` 放在最后(因为它更有意义,直观)并且低,看哪,我在使用 `-cfpJ` 时遇到了同样的失败,但是 `-cpJf` 可以工作。 (3认同)

Gil*_*il' 8

假根

fakeroot的效用,或较新的实用的fakeroot-NG(同样的目的,不同的实现技术)上运行的程序和假装的程序,它运行为根,并且该系统调用,如chown成功了。只有程序认为这些调用成功了,文件系统中实际上没有任何反映(不可能,因为fakeroot没有额外的权限)。但是,如果程序更改了文件的所有权,然后根据该文件的所有权采取了某些操作,则可能会更改程序的行为。

通过运行 fakeroot 环境来从 fakeroot 中获得有用的工作的典型方法是:

  1. 创建一些文件,移动它们,更改它们的所有权和模式等。
  2. 创建这些文件的存档。

例子:

fakeroot sh -c '
    chown root:root usr/bin/foo
    tar cf foo.tar usr
'
Run Code Online (Sandbox Code Playgroud)

您需要使用 的单个调用fakeroot,因为调用之间没有内存。

Linux 命名空间

为了完整起见,我会提到,如果您有 Linux 内核 3.8,那么命名空间是创建假装 root 环境的另一种方式。用户空间支持还没有完全到位,所以我不会详细介绍。

挂载档案

解决问题的另一种方法是将存档安装为目录。您可以使用archivemount,它能够通过libarchive修改多种存档格式,包括压缩的 tar。

mkdir mnt
archivemount foo.tar.xz mnt
chown root:root mnt/usr/bin/foo
fusermount -u mnt
Run Code Online (Sandbox Code Playgroud)