2

如果我运行命令

gpg -e -r john@doe.com my_secret_file.txt

从 unix 命令提示符下,它工作正常。但是当我尝试使用 PHP 使用相同的命令时,它不起作用:

$gpg = '/usr/bin/gpg';
$recipient = 'john@doe.com';
$secret_file = 'secret_file.txt';

echo shell_exec("$gpg -e -r $recipient $secret_file");

请指导我寻求解决方案。

4

3 回答 3

3

除了 Demento 建议的权限问题之外,脚本运行的用户也可能与您在命令行中工作时的用户不同,并且该用户没有 john@doe.com 的公钥,所以它无法为他加密文件。那么......哪个用户运行这个脚本?假设是www-data,如果你这样做

carlos@server:~$ su - www-data
(insert www-data's password or do sudo su - www-data if sudo it's available)
www-data@server:~$ gpg --list-keys

你看到 john@doe.com 的钥匙了吗?

于 2011-05-10T13:25:13.907 回答
2

我在我的机器上尝试了你的例子,它的工作原理和预期的一样。结果是本地目录中的一个附加文件,名为secret_file.txt.gpg,为 加密john@doe.com。这确认您的实际脚本没问题,并且可能存在其他问题。

您不会看到脚本本身的任何输出,加密文件是在静默中生成的。程序最后一行的echo什么都不做,因为如果没有问题, gpg 不会生成任何输出。你应该看看shell_exec的手册。

如果文件不是在您的计算机上创建的,则可能是权限问题。如果您不是从命令行而是从 Web 应用程序调用脚本,则 Web 服务器用户需要在文件系统上具有适当的权限才能创建新文件。

于 2011-05-10T12:58:13.523 回答
0

您可以使用以下命令查看错误:

$output = exec("$gpg -e -r $recipient $secret_file 2>&1", $out); 
echo "<pre>$output</pre>";

这将指导你。

可能的问题:

  • 您尝试加密的文件不在正确的路径中..
  • GnuPG 正在尝试使用“apache”作为用户写入 /root/.gnupg 目录。显然,除非您更改对此目录的访问权限(不推荐),否则这是不可能的。
  • 您无权访问 GnuPG 根目录(无论它在哪里)
  • 您在目录中没有 WRITE apache 正在尝试创建新文件..

让我知道您的代码输出什么,我将能够提供帮助。我已经遇到了,这很乏味。

于 2011-06-26T17:16:42.413 回答