通过PHP中的shell_exec压缩文件:路径问题

时间:2009-05-05 14:56:18

标签: php shell zip sudo shell-exec

我正在开发一个Web备份服务,其中一部分允许用户从他们备份的列表中下载包含他们所选文件的zip文件。

压缩过程是通过shell_exec命令完成的。为了实现这个目的,我已经为zip命令提供了apache用户无密码sudo权限。

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

这就是我的意思:

用户'test1'备份了他们的文件,存储如下
 / home / backups / test1 / my pics / pic1.jpg
 / home / backups / test1 / my pics / pic2.jpg
 / home / backups / test1 / my pics / pic3.jpg
 /home/backups/test1/hello.txt
 /home/backups/test1/music/band/song.mp3

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

是否有某种方法可以告诉zip截断路径,或为每个文件指定自定义路径? 或者有什么方法可以将工作目录更改为用户的根备份文件夹,这样我就可以简单地指定相对文件路径。

感谢阅读,希望你能走到这一步,这一切都有道理!

4 个答案:

答案 0 :(得分:2)

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

如果您 使用系统调用来执行此操作,我的建议是:

要截断您可以使用symbolic links的文件的路径。

你能否增加zip可执行文件的权限,以表示apache可以在不使用sudo的情况下使用它?

答案 1 :(得分:1)

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

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

答案 2 :(得分: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 .

您是否考虑过将sudo作为您尝试压缩文件的用户而不是root用户?这也会更安全。

答案 3 :(得分:0)

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

E.g。创建符号链接/ tmp / $ PID / my pics / pic1.jpg等,然后将所有内容压缩到/ tmp / $ PID。