「tar extract」が現在のディレクトリの権限を変更するのを防ぐ方法は?

「tar extract」が現在のディレクトリの権限を変更するのを防ぐ方法は?

私のタルボールを再現可能にしようとしたとき、私は以下に従いました。このガイド

副作用で解凍した後に変更される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
$

だから何が起こるのか:

  • tarファイルの./権限0500(別名r-x------
  • tarファイルを抽出すると、./ディレクトリ(現在のディレクトリ)も抽出され、その権限がアーカイブの権限に設定されます。
  • 操作後、ユーザーはディレクトリからファイルを削除できなくなり、他のユーザーはそのディレクトリで何もできません。

これは大きな驚きでした。ユーザーがシステムを「使用できない」ようにすることができます(たとえば、chmod a-rwxユーザーのホームディレクトリで効果的に実行します)。

もちろん、権限を復元するのは簡単です。chmod以前に聞いたことがある場合(通常のUbuntuユーザーは聞いたことがないでしょう)そして以前の権限を覚えていますか(自分と私がタルボールを抽出する任意のディレクトリについてはこれを言うことはできません)

だから私の質問は2つです。

  • tar --extract現在の作業ディレクトリの権限を維持しながら変更されないようにするにはどうすればよいですか?その他アーカイブに文書がありますか?
  • tar --create既知のルートコンポーネントを事前に計算しながらこれらのアーカイブが実際に作成されるのを防ぐには(最初の質問に対する答えがわからない人にも機能するように)、どうすればよいですか。

編集する

2番目の質問に対する答えの一部を見つけたかもしれません。

パスの変更を--transform 's|^\.|foobar|'willに変更返品その後、mangleの./エントリはfoobar/アーカイブで宣言された権限を取得します(そして現在の作業ディレクトリを保持します)。--transform 's|\./|foobar/|'理由を知りたいいいえmangle(正規表現とかなりよく一致する./ようです。\./

ベストアンサー1

私が知っている限り、.Tarballを抽出するときにメタデータの変更を防ぐ唯一の方法は、次のように既存のファイルをスキップすることです。--skip-old-filesオプションGNUで利用可能ですtar。これには上記の内容が含まれ、.結果は次のとおりです。どの既存のファイルはtarballのバージョンで上書きされていないままです。

なぜ失敗したのかわかりません--transform抽出時にパスを追加するための推奨方法開始アンカーポイントを目的のディレクトリに「代替」することです。例えば tar --transform 's,^,foobar/,' ...。シンボリックリンクを混乱させたくない場合は、サフィックスを追加できます。例えば tar --transform 's,^,foobar/,S'これはいいえシンボリックリンクターゲットに変換を適用します。

おすすめ記事