我在设置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的文件夹结构需要它。有帮助吗?我没有收到任何错误消息。提前谢谢!
答案 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);
}
它仅适用于安装了expect
和zipcloak
的Linux服务器,但这对我来说不是问题。我们运行linux并安装了两个工具。
答案 1 :(得分:0)
另一种方法:编译zip-3.0源代码并使用未记录的
-DPASSWD_FROM_STDIN
unix / Makefile中的选项。这将允许您从标准输入提供密码(重复两次)。
CFLAGS_NOOPT = -I. -DUNIX $(LOCAL_ZIP) -DPASSWD_FROM_STDIN