【问题标题】:using exec() with PHP to run a command使用 exec() 和 PHP 运行命令
【发布时间】:2015-04-25 05:45:14
【问题描述】:

我正在尝试通过 php 运行一个 openssl 命令,该命令通常可以正常工作,但是我尝试运行的一个特定命令不起作用。

这是手动运行的命令,完美运行:

openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout keyfile.key -out requestfile.csr

例如,这是一个 PHP 中的 openssl,它确实可以工作:

exec('C:/xampp/apache/bin/openssl ecparam -out keyfile.key -name prime256v1 -genkey');

通过 PHP 的相同命令不起作用..

exec('C:/xampp/apache/bin/openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj \'/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com\' -keyout keyfile.key -out requestfile.csr');

我认为双引号“/C=”中的部分有问题,可能无法正确解释。如果我通过 php 进行类似的 openssl 调用而没有 "" 中的部分,则命令执行良好。

希望有知识的 php 人检查它是否通过正确

请不要建议我使用 PHP 内置的 openssl 库,我很了解它们,并且我在不同的项目上工作,但我需要使用 exec() 来创建不可用的 ECC 密钥在 PHP 内置的 openssl 库中。

【问题讨论】:

  • 您是在命令提示符下使用“php filename.php”运行它吗?
  • 我有一个包含 exec() 命令的 php 文件,我只是在网络浏览器中运行该 php 页面。没有 exec() 的命令是我通过命令行运行的命令并且可以工作
  • 您可以尝试使用“php filename.php”从命令提示符而不是 Web 浏览器运行 php 脚本
  • 我不明白.. 如何从命令提示符运行 php 脚本?
  • 如果有帮助,我在 Windows 上。'php' is not recognized as an internal or external command, operable program or batch file.

标签: php openssl


【解决方案1】:

我不认为 Windows cmd.exe 允许您使用单引号来引用参数,您必须使用双引号。

exec('C:/xampp/apache/bin/openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout keyfile.key -out requestfile.csr');

【讨论】:

  • 最终,该命令需要引用字符串变量来构建请求,即exec('C:/xampp/apache/bin/openssl req -new -key '.$keyfile.' -out C:/xampp/htdocs/labs/test4/testcsr.txt -subj \'/C='.$country.'/ST='.$state.'/L='.$location.'/OU='.$orgUnit.'/O='.$org.'/CN='.$commonName.'\'');,但同样,它似乎无法从浏览器中工作 =(
  • 不幸的是没有.. 在浏览器中运行 php 文件后,php 日志文件仍为 0KB
  • 我们不要超越自己。首先尝试解决没有变量的问题,然后您可以添加变量。那么您是否检查了 PHP 错误日志?或者将error_reporting(E_ALL); 添加到脚本的开头?
  • 我同意,现在最好在没有任何变量的情况下进行故障排除。所以我添加了 error_reporting(E_ALL);并重新运行 php 文件,页面上仍然没有错误/警告,并且 php 日志保持在 0KB
  • 如果它没有报告错误,我不确定它为什么不会执行。您确定要在正确的位置查找输出文件吗?
最近更新 更多