rootユーザでtarを展開するとファイルの所有者が一般ユーザになりうる
結論
rootユーザがtarコマンドでtarファイルを展開するとき、デフォルトではtarファイルの作成時の所有者情報を引き継ごうとする。
他のホストで作成されたファイルだとしてもその所有者情報を引き継ごうとするため、引き継ぎたくない場合は、 --no-same-owner
を付ける。
例:
tar zxv --no-same-owner -f file.tar.gz
環境: Debian bullseye
man tar
man tar
より、root user(superuser)では --same-owner
が付与された状態と等価なので所有者情報を引き継ごうとする。root userの場合のみ --no-same-owner
を付与すれば所有者情報を引き継がなくなる。
--no-same-owner Extract files as yourself (default for ordinary users). --same-owner Try extracting files with the same ownership as exists in the archive (default for superuser).
きっかけ(余談)
Visual Studio Codeの Remote Container を使っていて、 Creating a non-root user に倣って一般ユーザで動作する以下のようなDockerfileを作成した際に、
FROM debian:bullseye-slim # root user RUN apt-get update && apt-get install -y curl && \ curl -L https://<domain>/foo.tar.gz | tar xzv -C /usr/local/src/ ARG USERNAME=vscode ARG USER_UID=1000 ARG USER_GID=$USER_UID RUN groupadd --gid ${USER_GID} ${USERNAME} && \ useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \ echo "done" USER vscode
chown -R vscode /usr/local/src/foo
としていないどころかuseradd前に配置した(展開した)ディレクトリにもかかわらず以下のように所有者がvscodeになっており、混乱した。
$ ls -l /usr/local/src/ total 4 drwxr-xr-x 19 vscode vscode 4096 Apr 26 13:47 foo
foo.tar.gz
を別途調べると、UID=1000で作成されていて、偶然vscode userに所有者情報がマッピングされていた、という顛末だった。
$ gunzip foo.tar.gz $ tar xf foo.tar --to-command 'echo $TAR_UID' | uniq 1000