【问题标题】:After tar extract, Changing Permissionstar 解压后,更改权限
【发布时间】:2011-02-22 22:18:28
【问题描述】:

今天只是一个关于 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 文件时。其他任何事情,我都很好。

【问题讨论】:

  • 100% 确定这是权限问题,而不是文件大小或其他问题?对chmod 的调用会返回什么?可以试试PHP内置的chmod()吗?
  • 如果描述正确,那么这不是文件的权限问题,因为权限0644将允许所有者读写所有其他文件。即使假设他没有以 root 身份运行,他也应该能够访问这些文件。
  • 它是共享主机,所以我不认为我是以 Root 身份运行的。

标签: php unix file-permissions tar


【解决方案1】:

如果您想保留文件的权限,则必须在解压缩 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");

【讨论】:

  • 不好。它现在似乎根本没有提取它。 “tar -xpzf”有效,但我仍然收到权限错误。
  • 哦,而且好像改变了当前目录的权限。无论如何我可以将 tar 提取到不同的目录,然后 Chmod 回到 755?
  • 您是否已经检查过提取的文件(即所有者、组和权限)?这些是否与您归档时使用的所有者、组和权限匹配?当然,您可以解压到另一个目录并 chmod 那里的文件,但使用 -p 开关应该可以正常工作。
  • 是的,它们匹配 - 最重要的是,我所在的目录也更改为 644,而不仅仅是文件。这是最奇怪的部分。
【解决方案2】:

编辑:--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 容器。

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2019-11-23
    • 2016-01-16
    相关资源
    最近更新 更多