Permissions
如何防止“tar extract”更改目前目錄的權限?
在嘗試使我的 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'
,它不會將轉換應用於符號連結目標。