Редактировать: --delay-directory-restore
решил проблему ниже из-за невозможности распаковать файл. Полномочия pwd по-прежнему изменяются, поэтому проблема с оригинальным постером может быть не решена.
Не совсем ответ, но способ воспроизвести ошибку.
Сначала создайте несколько файлов и каталогов. Удалить доступ на запись в каталогах:
mkdir hello
mkdir hello/world
echo "bar" > hello/world/foo.txt
chmod -w hello/world
chmod -w hello
Затем создайте файл tar из каталога, сохранив права доступа.
cd hello
tar -cpf ../hw.tar --no-recursion ./ world world/foo.txt
cd ..
Листинг архива:
tar -tvf hw.tar
# dr-xr-xr-x ./
# dr-xr-xr-x world/
# -rw-r--r-- world/foo.txt
До сих пор я не мог распаковать архив как обычный пользователь из-за ошибки «Permission denied». Архив не может быть наивно обработан. Изменяются и права локального каталога.
mkdir untar
cd untar
ls -ld .
# drwxr-xr-x ./
tar -xvf ../hw.tar
# ./
# world/
# tar: world: Cannot mkdir: Permission denied
# world/foo.txt
# tar: world/foo.txt: Cannot open: No such file or directory
# tar: Exiting with failure status due to previous errors
ls -ld .
# dr-xr-xr-x ./
Эксперименты с umask
и / или -p
не помогли. Тем не менее, добавление --delay-directory-restore
действительно помогает распутать:
tar -xv --delay-directory-restore -f ../hw.tar
# ./
# world/
# world/foo.txt
ls -ld .
# dr-xr-xr-x ./
chmod +w .
Также можно распаковать файл как root. Что меня больше всего удивило, так это то, что tar, очевидно, может изменять права доступа для pwd, что до сих пор не решено.
Кстати, я изначально попал в эту проблему, создав тарбол для / с
tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --one-file-system /
от имени пользователя root (pwd = /) и его обычному пользователю не нужно создавать контейнер linux.