【问题标题】:How to execute an external program, sending data to STDIN and capturing STDOUT?如何执行外部程序,向 STDIN 发送数据并捕获 STDOUT?
【发布时间】:2019-06-18 16:48:45
【问题描述】:

在我的 PHP 脚本中,我有一个变量 $pkcs7_bin,我想通过 openssl 对其进行转换。

假设我在文件中输入了内容,我可以使用 bash 执行此操作:

cat in.pkcs7 | openssl pkcs7 -inform DER > out.pkcs7

我想在 PHP 中做同样的事情,例如:

$exit_status execute('openssl pkc7 -inform DER', $pkcs7_bin, $pkcs7_out);

我当然不想使用中间文件。

这是一种简单的方法吗?

目前我已经写了这个:

function execute($process, $stdin, &$stdout)
{
    ob_start();
    $handle = popen($process, 'w');
    $write = fwrite($handle, $stdin)
    &$stdout = ob_get_clean();
    pclose($handle);
}

但我意识到ob_start 没有捕捉到我屏幕上刷新的输出:(

【问题讨论】:

  • 我对openSSL不太了解,但是PHP中有openSSL扩展。对您的用例来说还不够吗?
  • 谢谢,我知道,但这不是我的问题,标签是phppopen,而不是openssl :)
  • @Chipster,这不是重复的。看我问题的标题。我想将 STDIN 传递给命令并从 STDOUT 获取结果。您链接的问题没有解决这个问题。

标签: php popen


【解决方案1】:

对于控制台命令的一般用途,您所追求的是 shell_exec() - 通过 shell 执行命令并将完整的输出作为字符串返回

请注意,对于您的用例,PHP 提供的 OpenSSL 函数可能会执行您“本机”需要执行的操作,而无需担心生成 shell(出于安全原因通常禁用)

不管怎样,回到 shell_exec():

cat in.pkcs7 | openssl pkcs7 -inform DER > out.pkcs7

可以这样做 // 以某种方式获取输入数据。你可以 // shell_exec 你原来的命令,使用正确的 // 文件的路径,然后用 file_get_contents() 读出.pkcs7 $infile=file_get_contents("/path/to/in.pcs7"); $result=shell_exec("echo ".$infile." | openssl pcks7 - 通知 DER");

可能/将/确实需要与"' 一起处理$infile 内容中的特殊字符。将$infile 更改为您要发送的任何输入,只要确保在需要时正确引用/转义即可。

【讨论】:

  • 我在问题中提到我不想使用中间文件。在您的回答中,您使用了我想从 PHP 中提取的 $infile
  • @nowox - 根据我发布的内容,$infile 可以包含您喜欢的任何内容...
  • 如果$infile 包含u | sh -c "rm -rf /" 怎么办?
  • @nowox - 好吧,如果你真的想让它包含...请随意。
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多