Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在tar提取之后,更改权限_Php_Unix_File Permissions_Tar - Fatal编程技术网

Php 在tar提取之后,更改权限

Php 在tar提取之后,更改权限,php,unix,file-permissions,tar,Php,Unix,File Permissions,Tar,只是一个关于unix和PHP的问题 我在PHP上所做的是使用Unix系统来解压一个tarred文件 exec(“tar-xzf foo.tar.gz”) 一般来说,在我遇到这个特定的foo.tar.gz之前,一切都正常工作,它的文件系统如下: Applications/ Library/ Systems/ 运行tar命令后,文件权限似乎更改为644(而不是755) 这会导致权限被拒绝(错误号13),从而禁用我的大部分代码。(我猜是因为没有特权) 我能阻止这个tar命令完全破坏我的权限吗 谢谢

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

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

exec(“tar-xzf foo.tar.gz”)

一般来说,在我遇到这个特定的foo.tar.gz之前,一切都正常工作,它的文件系统如下:

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

这会导致权限被拒绝(错误号13)
,从而禁用我的大部分代码。(我猜是因为没有特权)

我能阻止这个tar命令完全破坏我的权限吗

谢谢


哦,这似乎只有当我有一个foo.tar.gz文件,它有这个特殊的文件系统时才会发生。如果您想保留对文件的权限,则在提取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");
编辑:
--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 .
也可以将该文件解压为根目录。最让我吃惊的是,tar显然可以更改pwd的权限,这一问题仍然没有解决

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

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

作为root用户(pwd=/)创建linux容器,并以普通用户的身份对其进行更正。

100%确定这是权限问题,而不是文件大小或其他问题?调用
chmod
返回什么?你能试试PHP内置的
chmod()
?如果描述正确,那么这就不是文件的权限问题,因为权限0644将允许所有者读取、写入和读取所有其他文件。即使假设他不是以root身份运行,他也应该能够访问这些文件。这是共享主机,所以我不认为我是以root身份运行的。不好。它现在似乎一点也没有提取出来。“tar-xpzf”可以工作,但是我仍然得到了权限错误。哦,它似乎改变了当前目录中的权限。我是否可以将tar提取到另一个目录中,然后将其返回到755?您是否已经检查了提取的文件(即所有者、组和权限)?这些是否与存档时使用的所有者、组和权限相匹配?当然,你可以提取到另一个目录,并对那里的文件进行chmod,但是使用-p开关应该可以正常工作。是的,它们匹配-最重要的是,我所在的目录也会更改为644,而不仅仅是文件。这是最奇怪的部分。