Permissions

如何防止“tar extract”更改目前目錄的權限?

  • September 16, 2021

在嘗試使我的 tarball 可重現時,我遵循了本指南

作為副作用,我注意到我可以輕鬆地創建一個 tar 文件,當解壓縮時會更改目前工作目錄的權限(我將文件解壓縮到其中)。

像這樣:

$ rm -rf /tmp/user
$ mkdir -p /tmp/user/test
$ touch /tmp/user/test/README.txt

$ ls -lhan /tmp/user/ /tmp/user/test/README.txt 
-rw-r--r-- 1 11002 11002    0 Sep 15 10:31 /tmp/user/test/README.txt
/tmp/user/:
total 32K
drwxr-xr-x  3 11002 11002 4.0K Sep 15 10:31 .
drwxrwxrwt 23     0     0  20K Sep 15 10:31 ..
drwxr-xr-x  2 11002 11002 4.0K Sep 15 10:31 test
$ cd /tmp/user/test
$ tar --numeric-owner --owner=0 --group=0 --mode="go-rwx,u-w" --transform 's|\./|foobar/|' \
     -czf ../foobar.tgz .
$ tar tvf ../foobar.tgz
dr-x------ 0/0               0 2021-09-15 10:25 ./
-r-------- 0/0               0 2021-09-15 10:25 foobar/README.txt
$ cd /tmp/user/
$ tar xvf foobar.tgz
$ ls -lhan
total 40K
dr-x------  4 11002 11002 4.0K Sep 15 10:31 .
drwxrwxrwt 23     0     0  20K Sep 15 10:31 ..
drwxr-xr-x  2 11002 11002 4.0K Sep 15 10:33 foobar
-rw-r--r--  1 11002 11002  143 Sep 15 10:32 foobar.tgz
drwxr-xr-x  2 11002 11002 4.0K Sep 15 10:31 test
$ rm foobar.tgz 
rm: cannot remove 'foobar.tgz': Permission denied
$

所以會發生什麼:

  • tarfile 包含一個./具有權限的條目0500(又名r-x------
  • 提取 tarfile 時,它還將提取./目錄(恰好是目前目錄)並將其權限設置為存檔中找到的權限
  • 操作後,使用者無法再從該目錄中刪除文件,其他人也無法再對其進行任何操作。

這是一個很大的驚喜。它可能使系統對使用者“不可用”(例如,有效地chmod a-rwx在使用者主目錄上執行)。

當然,恢復權限很容易——如果你以前聽說chmod過(典型的 Ubuntu 使用者可能沒有聽說過)並且你記得之前的權限(我不能為自己說這些,以及我將提取 tarball 的任意目錄)

所以我的問題是雙重的:

  • 如何防止tar --extract更改目前工作目錄的權限,同時仍保留存檔中其他文件的權限?
  • 我怎樣才能防止tar --create實際創建這樣的檔案(這樣它也適用於不知道第一個問題的答案的人),同時仍然預先考慮已知的路徑組件)?

編輯

我可能已經找到了我的第二個問題的部分答案。

將路徑修改更改為--transform 's|^\.|foobar|'也會將條目修改./foobar/,然後將獲得存檔中聲明的權限(並保留我目前的工作目錄)。我想知道為什麼不會--transform 's|\./|foobar/|'弄亂(因為這似乎很好地匹配了正則表達式。./``\./

據我所知,.在提取 tarball 時防止更改 ’s 元數據的唯一方法是跳過現有文件,--skip-old-files選項在 GNU中可用tar。這涵蓋的範圍超過.並將導致任何現有文件保持原樣,而不是被 tarball 中的版本覆蓋。

我不確定你為什麼--transform失敗。提取時添加路徑的推薦方法是用所需目錄“替換”起始錨點,例如 tar --transform 's,^,foobar/,' .... 為了避免弄亂符號連結,可以添加一個後綴,例如 tar --transform 's,^,foobar/,S',它不會將轉換應用於符號連結目標。

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