#php #windows #exec #gnupg
#php #Windows #exec #gnupg
Вопрос:
Мне нужна помощь в шифровании файлов на PHP с использованием GPG. Я провел некоторое исследование, но пока не могу найти решение.
Использование GPG в командной строке работает отлично, но когда я пытаюсь с PHP, я получаю возвращаемое значение 2. Я также пытался передать ‘—yes —always-trust’ в качестве дополнительных переключателей для command, как предложено в одном из ответов на SO, но без радости.
Я пытался использовать встроенную в PHP функцию gnupg — все примеры, которые я нашел, показывают, как шифровать строки, а не файлы. чтение файла в виде строки не будет работать для меня, потому что я работаю с большими файлами размером до 15 МБ.
Мне нужна помощь!
Сведения о среде
OS: Windows 7
PHP installation: WAMP Server 2.1
Код
$path = "c:wampwww";
$recipient = "Test user";
$encrypted_file = "c:wampwwwtest.txt.gpg";
$decrypted_file = "c:wampwwwdecrypted_test.txt";
$plain_file = "c:wampwwwtest.txt";
exec('gpg --homedir $path --recipient $recipient --output $encrypted_file --encrypt $plain_file --yes --always-trust', $answer, $rtn);
var_dump($answer);
var_dump($rtn);
echo "<br />ANSWER: ".$answer;
echo "<br />RTN: ".$rtn;
Вывод
array(0) { } int(2)
ANSWER: Array
RTN: 2
PHP User: nt authoritysystem
Ответ №1:
Попробуйте изменить
exec('gpg --homedir $path --recipient $recipient --output $encrypted_file --encrypt $plain_file --yes --always-trust', $answer, $rtn);
Для
exec("gpg --homedir $path --recipient $recipient --output $encrypted_file --encrypt $plain_file --yes --always-trust", $answer, $rtn);
Обратите внимание, что я изменил одинарные кавычки на двойные
Комментарии:
1. Я последовал вашему предложению, но результат остался прежним
2. Raptor и Vascowhite большое спасибо — вы наставили меня на правильный путь. Я смог заставить его работать. Проблема в том, что значения переключателя должны быть в двойных кавычках («»). exec(«gpg —homedir «$path » —получатель «$получатель » — вывод «$encrypted_file » -шифрование «$plain_file » -да -всегда-доверие», $answer, $ rtn);
Ответ №2:
Вы путаете использование одинарных и двойных кавычек.
$path = 'c:wampwww';
$recipient = 'Test user';
$encrypted_file = 'c:wampwwwtest.txt.gpg';
$decrypted_file = 'c:wampwwwdecrypted_test.txt';
$plain_file = 'c:wampwwwtest.txt';
И в этой строке:
exec("C:\Wamp\WWW\gpg --homedir $path --recipient $recipient --output $encrypted_file --encrypt $plain_file --yes --always-trust", $answer, $rtn);
Используйте двойные кавычки, когда строка должна быть проанализирована PHP (обратите внимание на Escape-символы); используйте одинарные кавычки, когда строка не нуждается в анализе.
Комментарии:
1. Я последовал вашему предложению, но результат остался прежним
2. дважды проверьте права на выполнение? Кроме того, вы должны указать полный путь к GPG для
exec()
функции.3. Права на выполнение: пользователь PHP является nt authority system — я думаю, у пользователя должны быть права на выполнение. Полный путь к GPG: у меня есть локальная версия GPG, запущенная в C:WampWWW следуя предложенным шагам ( glump.net/howto/gpg_intro )
4. неверно. NT_AUTHORITY SYSTEM НЕ обязательно имеет права. Вы должны дважды проверить права доступа к папке. Например, в некоторых случаях пользователь PHP не имеет прав на C:WINDOWSTemp