1

我想使用 PHP 来“执行”一个 pgp 加密命令。无论命令行如何,我都会收到 err 64(解析器错误)或 162(编码期间完全失败)。因此,我将 PHP 程序中的命令行简化为这个仍然会出错的简单指纹显示:

exec("/opt/pgp/bin/pgp --fingerprint", $results);

如果我在命令行上运行“/opt/pgp/bin/pgp --fingerprint”,我会得到“找到 2 个键”和预期的显示。但是 PHP 下的同一个 exec 给了我解析器错误 64。我已经尝试过 "\n" 到字符串命令,但这并没有什么不同。用户在浏览器中以“nobody”身份运行,该浏览器对 pgp 具有执行权限。(如果 pgp 至少没有启动,我什至不会从中看到“解析器错误”。)

为了在 PHP 下运行 pgp,我需要做些什么特别的事情吗?


我已经回过头来尝试实际加密数据文件。这是 pgp 创建的“状态文件”输出。它清楚地在我尝试加密“test.txt”的文件的“权限被拒绝”的最后一行显示错误。那是假的。我已将所有世界 r/w 授予该文件,并且它清楚地访问它,因为状态表明它已加密内容。所以,真正的问题是什么是被拒绝的许可?

其他一些信息:如果我从命令行针对调用 pgp 的 PHP 脚本运行 PHP,它工作正常 - 文件被加密。此外,当从浏览器调用 PERL 时,它会运行相同的命令(使用 SYSTEM())。但是,当浏览器用于调用此 PHP 脚本时,它会失败。显然,以“无人”身份运行存在一些权限问题。

/export/home/pgphome/.pgp/pubring.pkr:open keyrings (1006:public keyring) /export/home/pgphome/.pgp/secring.skr:open keyrings (1007:private keyring) 0x221DC947:encrypt (1030:密钥添加到收件人列表)/export/home/eckankar/dev/www/info/test.txt:encrypt(3048:使用密码 AES-128 加密的数据)/export/home/eckankar/dev/www/info/test。 txt:加密(3124:权限被拒绝)

作为背景,这里是 PHP exec() 命令的参数: /opt/pgp/bin/pgp --encrypt /export/home/eckankar/dev/inc/test.txt --output /export/home/eckankar/dev /www/info/test.xxx -r members --overwrite remove --home-dir /export/home/pgphome/.pgp -v --status-file /export/home/eckankar/dev/inc/test.txt 。呃

此命令中的所有文件夹/目录都已将“rwx”授予世界。

以下是加密成功时状态输出文件的样子,就像从命令行 (/opt/csw/php5/bin/php test.php) 运行而不是通过浏览器运行时一样:

pgp:encrypt (3157:current local time 2009-06-30T11:51:17-05:00) /export/home/pgphome/.pgp/pubring.pkr:open keyrings (1006:public keyring) /export/home/ pgphome/.pgp/secring.skr:open keyrings (1007:private keyring) 0x221DC947:encrypt (1030:key added to recipient list) /export/home/eckankar/dev/inc/test.txt:encrypt (3048:data encrypted使用密码AES-128)/export/home/eckankar/dev/inc/test.txt:encrypt(0:输出文件/export/home/eckankar/dev/inc/test.txt.pgp)

4

3 回答 3

1

答案是:需要在命令行中指定一个--temp-dir。

于 2009-06-30T23:17:26.767 回答
0

这个 PHP 脚本在什么执行上下文中运行?交互式命令行、cron 作业、Web 服务器(我希望不是)?

根据对此的答案,我可能会开始查看 PGP 所依赖的环境变量,当它从该脚本运行时未设置这些环境变量。

于 2009-06-29T18:30:07.687 回答
0

我知道这是旧的,但我只是被它咬了。(pgp 8.5)

正如 Jim Thomas 所说,这是一个目录权限问题。但至少 pgp 8.5 不允许您以任何我能看到的方式设置 tmpdir。

我的解决方案(伪代码):

save cwd
chdir(/tmp/)
system()/exec() pgp command
chdir(saved_cwd)

奇怪的是 pgp 强制在 cwd 中创建 tmp 目录,但我没有看到影响位置的标志。

于 2015-05-21T20:05:04.017 回答