После извлечения смолы, Изменение разрешений - PullRequest
4 голосов
/ 23 мая 2010

Просто вопрос по поводу Unix и PHP сегодня.

Что я делаю на своем PHP, так это использую систему Unix для распаковки tar-файла.

exec("tar -xzf foo.tar.gz");

Как правило, все работает нормально, пока я не запускаю этот конкретный файл foo.tar.gz, который имеет файловую систему следующим образом:

Applications/
Library/
Systems/

После запуска команды tar кажется, что права доступа к файлу изменены на 644(вместо 755).

Это вызывает Permission denied (errno 13) и, следовательно, отключает большую часть моего кода.(Я думаю, из-за отсутствия привилегий)

Как я могу остановить эту команду tar, полностью разрушив мои разрешения?

Спасибо.

Да, и это, кажется, происходит только тогда, когда у меня есть файл foo.tar.gz, имеющий эту конкретную файловую систему.Что-нибудь еще, и я хорошо.

Ответы [ 2 ]

2 голосов
/ 25 мая 2010

Если вы хотите сохранить права доступа к файлам, вам нужно добавить параметр -p (или --preserve-permissions или --same-permissions) при извлечении архива.Из страниц man tar:

--preserve-permissions
--same-permissions
-p
    When `tar' is extracting an archive, it normally subtracts the
    users' umask from the permissions specified in the archive and
    uses that number as the permissions to create the destination
    file.  Specifying this option instructs `tar' that it should use
    the permissions directly from the archive.

Таким образом, PHP-код должен быть:

exec("tar -xzfp foo.tar.gz");
0 голосов
/ 25 марта 2015

Редактировать: --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.

...