我正在开发一个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截断路径,或为每个文件指定自定义路径? 或者有什么方法可以将工作目录更改为用户的根备份文件夹,这样我就可以简单地指定相对文件路径。
感谢阅读,希望你能走到这一步,这一切都有道理!
答案 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。