proc_open zipcloak不起作用

时间:2014-10-13 16:32:42

标签: php shell zip ziparchive

我在设置zip文件的密码时遇到问题。服务器运行php 5.5,ZipArchive::setPassword()仅支持php 5.6。我的老板不想升级到php 5.6,所以我必须使用proc_open()zipcloak命令绕过设置自动生成的zip文件的密码。然而,它似乎并没有起作用。这是我的代码:

    /**
     * filename = the name of the zip file you want to encrypt containing the file path as well 
     **/
    public function encryptZip($filename, $password){
        $command = 'zipcloak ' . $filename;
        $descriptorspec = array(
        0 => array("pipe", "r"),  // stdin
        1 => array("pipe", "w"),  // stdout
        2 => array("pipe", "w"),   // stderr
        );

    // Opening the process
        $process = proc_open($command, $descriptorspec, $pipes);
        if(is_resource($process))
        {
        fwrite($pipes[0], $password."\n".$password);
        fclose($pipes[0]);
        fclose($pipes[1]);
        fclose($pipes[2]);
        // Closing the process
        $return_value = proc_close($process); // This prints 12
        }
    }
}
// end of class
$zip = new DZip();
$zip->encryptZip('path/to/zip.zip', '12345');

zipcloak命令要求输入密码两次,这就是我使用fwrite($pipes[0], $password."\n".$password);的原因。我已经在网上搜索了几个小时以获得更简单的解决方案,我也找到了zip -P [password],但它只创建了新文件,我用ZipArchive创建了我的zip文件,因为zip的文件夹结构需要它。有帮助吗?我没有收到任何错误消息。提前谢谢!

2 个答案:

答案 0 :(得分:1)

所以,我自己找到了解决方案。我创建了一个shell脚本:

#!/bin/bash
command -v zipcloak && echo "exist" || exit -1;
command -v expect && echo "exist" || exit -1;
MYPWD="[password]"
expect -c ' 
spawn zipcloak [filename]
expect "*Enter password*" 
sleep 0.1
send  "'"$MYPWD"'\r"
sleep 0.1
expect "*Verify password*" 
sleep 0.1
send  "'"$MYPWD"'\r"
sleep 0.1
'

我可以简单地使用我的php代码中的exec:

public function encryptZip($filename, $password, $bashdir){
    $bash = str_replace('[filename]', $filename, (str_replace('[password]', $password, file_get_contents($bashdir))));
    exec($bash);
}

它仅适用于安装了expectzipcloak的Linux服务器,但这对我来说不是问题。我们运行linux并安装了两个工具。

答案 1 :(得分:0)

另一种方法:编译zip-3.0源代码并使用未记录的

-DPASSWD_FROM_STDIN
unix / Makefile中的

选项。这将允许您从标准输入提供密码(重复两次)。

CFLAGS_NOOPT = -I. -DUNIX $(LOCAL_ZIP) -DPASSWD_FROM_STDIN