【问题标题】:Zipping files through shell_exec in PHP: problem with paths在 PHP 中通过 shell_exec 压缩文件:路径问题
【发布时间】:2009-05-05 14:56:17
【问题描述】:

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

压缩过程是通过 shell_exec 命令完成的。为此,我已授予 apache 用户 no-password sudo 对 zip 命令的权限。

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

这就是我的意思:

用户“test1”备份了他们的文件,这些文件存储如下
/home/backups/test1/我的图片/pic1.jpg
/home/backups/test1/我的图片/pic2.jpg
/home/backups/test1/我的图片/pic3.jpg
/home/backups/test1/hello.txt
/home/backups/test1/music/band/song.mp3

压缩这些文件时,它们会保留完整路径,但我只想显示:
我的照片/pic1.jpg
我的照片/pic2.jpg
我的照片/pic3.jpg
你好.txt
音乐/乐队/歌曲.mp3

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

感谢您的阅读,希望您能走到这一步,这一切都有意义!

【问题讨论】:

    标签: php shell zip sudo shell-exec


    【解决方案1】:

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

    如果您必须通过系统调用来实现,我的建议是:

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

    能不能不增加zip可执行文件的权限,让apache不用sudo也可以使用?

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • PHP 使用 apache 用户,该用户无权访问包含用户文件的目录。我使用“sudo zip ...”执行压缩,但是“sudo cd /path/to/folder”无法完成。
      【解决方案3】:

      一个更好的主意可能是制作一个 shell 脚本,并授予网络服务器 sudo 访问该 shell 脚本的权限。这也可能更安全

      #!/bin/bash
      #
      # Zip up files for a given user
      # 
      # usage: backupToZipFile.sh <username>
      
      cd home/backups/$1
      tar -czf /tmp/$1.tgz .
      

      您还考虑过以您尝试压缩文件的用户身份而不是 root 用户身份运行 sudo 吗?这样也会更安全。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2012-09-05
          • 1970-01-01
          • 2019-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-07
          相关资源
          最近更新 更多