4

今天只是一个关于 unix 和 PHP 的问题。

我在我的 PHP 上做的是使用 Unix 系统解压缩一个 tarred 文件。

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

通常一切正常,直到我遇到这个特定的 foo.tar.gz,它的文件系统如下:

Applications/
Library/
Systems/

运行 tar 命令后,文件权限似乎更改为 644(而不是 755)。

这会导致Permission denied (errno 13)并因此禁用我的大部分代码。(我猜是因为缺乏特权)

有什么办法可以阻止这个 tar 命令完全破坏我的权限?

谢谢。

哦,这似乎只发生在我有一个具有这个特定文件系统的 foo.tar.gz 文件时。别的什么,我很好。

4

2 回答 2

2

如果要保留文件的权限,则必须在提取 tarball 时添加 -p(或 --preserve-permissions 或 --same-permissions)开关。从 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");
于 2010-05-25T07:56:08.287 回答
0

编辑:--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

到目前为止,由于“权限被拒绝”错误,我无法以普通用户身份解压存档。档案不能天真地解压。本地目录的权限也会改变。

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 的权限,目前还没有解决。

顺便说一句,我最初是通过为 / with 创建一个 tarball 来解决这个问题的

tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --one-file-system /

作为 root (pwd=/) 并以普通用户身份解压以创建 linux 容器。

于 2015-03-25T11:22:32.137 回答