proc_open zipcloak не работает

У меня проблема с установкой пароля для 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 потому что структура папок почтового индекса требует этого. Любая помощь? Я не получаю никаких сообщений об ошибках. Заранее спасибо!

0

Решение

Итак, я нашел решение сам. Я создал сценарий оболочки:

#!/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, и оба инструмента установлены.

1

Другие решения

Альтернатива: скомпилируйте исходники zip-3.0 и используйте недокументированные

-DPASSWD_FROM_STDIN

опция в unix / Makefile. Это позволит вам ввести пароль (повторяется дважды) из стандартного ввода.

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

По вопросам рекламы [email protected]