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