У меня проблема с установкой пароля для zip-файлов. Сервер работает php 5.5 и ZipArchive::setPassword()
поддерживается только PHP 5.6. Мой босс пока не хочет обновляться до php 5.6, поэтому я должен обойти настройку паролей для автоматически сгенерированных zip-файлов, используя proc_open()
и zipcloak
команда. Однако это не похоже на работу. Вот мой код:
/**
* 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]
тоже, но он создает только новые файлы, и я создаю свои ZIP-файлы с ZipArchive
потому что структура папок почтового индекса требует этого. Любая помощь? Я не получаю никаких сообщений об ошибках. Заранее спасибо!
Итак, я нашел решение сам. Я создал сценарий оболочки:
#!/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
'
Я могу просто использовать exec из моего PHP-кода:
public function encryptZip($filename, $password, $bashdir){
$bash = str_replace('[filename]', $filename, (str_replace('[password]', $password, file_get_contents($bashdir))));
exec($bash);
}
Работает только на серверах Linux, где expect
а также zipcloak
установлены, но это не проблема для меня. Мы запускаем Linux, и оба инструмента установлены.
Альтернатива: скомпилируйте исходники zip-3.0 и используйте недокументированные
-DPASSWD_FROM_STDIN
опция в unix / Makefile. Это позволит вам ввести пароль (повторяется дважды) из стандартного ввода.
CFLAGS_NOOPT = -I. -DUNIX $(LOCAL_ZIP) -DPASSWD_FROM_STDIN