2009-05-05 91 views
1

我正在开发一个网络备份服务的一部分,该部分允许用户下载一个zip文件,其中包含他们从已备份列表中选择的文件。通过shell_exec在PHP中压缩文件:问题与路径

压缩过程是通过shell_exec命令完成的。为了这个工作,我给了zip命令apache用户无密码的sudo权限。

我的问题是,因为我不能对包含用户备份文件的文件夹执行“sudo cd/path/to/user/files”,我需要指定要压缩文件的完整绝对路径,然后进入我不想要的zip文件。

这里就是我的意思是:

用户, 'TEST1' 有自己的文件备份其中存储如下
/家庭/备份/ test1的/我的图片/ pic1.jpg
/家庭/备份/ TEST1 /我的图片/ pic2.jpg
/家庭/备份/ test1的/我的图片/ pic3.jpg
/home/backups/test1/hello.txt
/家庭/备份/ TEST1 /音乐/乐队/歌曲.mp3

当这些文件被压缩时,它们保留完整的路径但我只是想让它显示:
我的图片/ pic1.jpg
我的图片/ pic2.jpg
我的图片/ pic3.jpg
hello.txt的
音乐/乐队/ Song.mp3的

有没有办法告诉zip截断路径,或为每个文件指定一个自定义路径?
或者有什么方法可以将工作目录更改为用户的根备份文件夹,以便我可以简单地指定相关文件路径。

感谢您的阅读,希望您有这么远,这一切都有道理!

回答

1

您是否尝试过使用chdir()来更改工作目录?

chdir('/home/backups/test1/'); 
+0

PHP使用apache用户无法访问用户文件的目录。我使用“sudo zip ...”来执行压缩,但不能完成“sudo cd/path/to/folder”。 – Nick 2009-05-05 15:15:50

0

这似乎是一个简单的选择,但根据man它只是不存在。当然,你可以将要存档的东西符号链接到你要创建zip文件的位置(我假设你实际上可以cd到那个目录)。使用适当的选项,zip不会将符号链接本身存档,而是将符号链接的文件存档,而使用符号链接的名称。

例如创建符号链接/ tmp/$ PID/my pics/pic1.jpg等,然后在/ tmp/$ PID中压缩所有内容。

2

我不得不稍微质疑为什么当有大量很好的PHP压缩类的时候,你正在做一个有潜在危险的系统shell调用。 tutorial here显示了如何轻松创建一个将输出zip文件到浏览器的类。在phpclasses.org上还有很多类,this seems to be the best one

如果一个系统来做,打电话给我的建议是:

要截断了,你可以使用symbolic links文件的路径。

难道你不能增加zip可执行文件的权限来表示apache不使用sudo就可以使用它吗?

1

一个更好的主意可能是创建一个shell脚本,并授予webserver sudo对该shell脚本的访问权限。这可能是更安全的,因为

#!/bin/bash 
# 
# Zip up files for a given user 
# 
# usage: backupToZipFile.sh <username> 

cd home/backups/$1 
tar -czf /tmp/$1.tgz . 

也有你认为运行须藤你尽力zip文件作为用户,而不是作为根?这也会更安全。