Files

修改 tar 存檔中文件的文件所有權

  • May 10, 2015

我正在以使用者身份工作,我想創建一個 tar 存檔,在解壓縮時(由 root 使用者)將提取其具有 root 所有權的文件(否則,在提取文件後,root 必須手動更改每個文件的所有權到目的地)。

我發現fakeroot這似乎正是這樣做的。但我找不到創建檔案所需的語法。

如何創建 tar.xz 存檔,以便在由 root 解包時文件具有 root 所有權?

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

如何創建 tar.xz 存檔,以便在由 root 解包時文件具有 root 所有權?

這取決於解包的根:

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

如果你想讓它們都以 root 開頭,你可以使用

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

假根

fakeroot實用程序或較新的實用程序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,那麼命名空間是創建假根環境的另一種方式。使用者空間支持還不完全存在,所以我不會更詳細地介紹。

掛載存檔

解決問題的另一種方法是將存檔掛載為目錄。您可以使用archivemount,它能夠通過libarchive修改多種存檔格式,包括壓縮的 tar。

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

引用自:https://unix.stackexchange.com/questions/125419