代码之家  ›  专栏  ›  技术社区  ›  nowox

如何执行外部程序,向stdin发送数据并捕获stdout?

  •  3
  • nowox  · 技术社区  · 5 年前

    在我的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 :(

    2 回复  |  直到 5 年前
        1
  •  -1
  •   ivanivan    5 年前

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

    注意,对于您的用例,php提供的openssl函数可以“本地”执行您需要执行的操作,而不必担心生成shell(通常出于安全原因而禁用)

    无论如何,回到shell_exec():

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

    可以做为 //以某种方式获取输入数据。你可以 //shell_执行原始命令,使用正确的 //files的路径,然后使用file_get_contents()读取.pkcs7 $in file=文件获取内容(“/path/to/in.pcks7”); $result=shell_exec(“echo”..$infile.“openssl pcks7-inform der”);

    梅/威尔/确实需要和 " ' 处理 $infile 内容。变化 美元汇率 无论你要发送什么样的输入,只要确保引用/转义正确,如果需要的话。

        2
  •  -1
  •   Chipster    5 年前

    我只能说,你只需要 fread() fwrite() .

    Other places I've seen ( and here too )似乎都是使用fread()和fwrite()来实现这一目的。不需要ob_start()。

    ob_start() 用于 output buffering ,这完全是另一回事。