如何在 Windows 上从 PHP 中启动基于 WSL 的 Linux 可执行文件并捕获其标准输出?

How can I start a WSL-based Linux executable from within PHP on Windows and capture its stdout?

我有一个程序只能在 Linux 上运行,我的开发环境在 Windows。


Cmd.exe:

C:\wsl echo "foo"
foo

PHP:

<?php
    $cmd = 'wsl echo "foo"';
    exec($cmd, $out, $code);
    dd($out, $code);
?>
// $out is []
// $code is -1073740791

正如评论中所讨论的,潜在的问题是您的系统范围的 Apache Web 服务器服务 (wampapache64) 被配置为 运行 作为 NT Authority\SYSTEM(又名 Local SystemLocalSystem).

...并且 运行将任何类似网络服务器的东西设置为 LocalSystem 是一个非常非常糟糕的主意 出于其他原因,尤其是当这是 运行ning PHP 代码 - 上传文件处理中的一个简单错误或未能正确清理用户输入可能会破坏您的整个计算机,尤其是当它是一个公开暴露的网络服务器时,恶意软件攻击者可以连接到。


无论如何:

显然,当一个进程 运行 宁作为 SYSTEM 它不能使用 Win32 的 CreateProcess 调用 wsl 然后间接调用 Linux 程序。

因此,通过将您的网络服务器更改为 运行 作为 真实用户帐户,这意味着 CreateProcess... 调用在 wsl 内调用受支持的环境。