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


10

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

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

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

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

Answers:


12

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

这取决于解包的根本:

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

如果要使它们成为所有根目录,可以使用

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

这对我不起作用:tar --owner=root --group=root cfpJ files.tar.xz files/给我错误 tar: You must specify one of the -Acdtrux'或--test-label' options Try tar --help'或tar --usage' for more information.
user1968963 2014年

-在短选项字符串之前需要一个:tar --owner=root --group=root -cfpJ ...-cfpJ,而不是cfpJ
goldilocks 2014年

tar --owner=root --group=root -cfpJ files.tar.xz files/给了我另一个错误:tar: files.tar.xz: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors此外,它创建了一个名为的文件pJ
user1968963 2014年

3
好的。我总是把f结尾放在最后(因为从直观上讲它更有意义)并且低估了,-cfpJ但是在BUT -cpJf工作中我遇到了同样的失败。
goldilocks 2014年

@ user1968963:f应该始终位于文件名之前,因为这意味着“下一个参数是文件名”。如果您不将其放在文件名之前,则tar会认为文件名是“”,然后它会尝试打开一个“”文件,但它无法统计(当然)。
奥利维尔·杜拉克

8

假根

fakeroot的效用,或较新的实用的fakeroot-NG(同样的目的,不同的实现技术)上运行的程序和假装的程序,它运行为根,并且该系统调用,如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,则命名空间是创建假装根环境的另一种方法。用户层支持还不完善,因此我将不做更多详细介绍。

挂载档案

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

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

的不错技巧archivemount,但仍然需要特权提升,即使用户位于允许挂载和卸载的受信任组中,该过程也会在上失败chown,因此需要使用某种第三方工具,例如fakeroot或名称空间也一样
安东·萨姆索诺夫,2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.