使用命令行程序

WASI 通过一个被称为“基于能力的安全”的细粒度安全模型让 WebAssembly 程序可以调用宿主操作系统的标准库函数。WebAssembly 虚拟机所有者可以在虚拟机启动的时候给 VM 赋予访问宿主系统资源的权限。程序默认不能访问任何没有被显式允许访问的资源,比如文件夹。

但为什么要将我们自己限制在标准库函数上呢? 我们可以用同样的方法在 WebAssembly 中调用任何宿主函数。WasmEdge 提供了一个类似 WASI 的拓展,可以访问在宿主操作系统中的任何命令行程序。

这些命令行程序可以

  • 从命令行参数中获取输入,包括 STDIN 流。
  • 通过 STDOUT 流来返回值和数据。

开发者可以使用我们的 Rust 接口库来访问这个功能。确保你在 Cargo.toml 中添加了这个依赖项。

[dependencies] rust_process_interface_library = "0.1.3"

现在你可以在 Rust 应用程序中使用这个接口启动一个新的进程,来运行操作系统中的命令行程序,通过 arg() 方法或者 STDIN 传入参数,并通过 STDOUT 接收返回值。

  1. #![allow(unused)]
  2. fn main() {
  3. let mut cmd = Command::new("http_proxy");
  4. cmd.arg("post")
  5. .arg("https://api.sendgrid.com/v3/mail/send")
  6. .arg(auth_header);
  7. cmd.stdin_u8vec(payload.to_string().as_bytes());
  8. let out = cmd.output();
  9. }

然后编译这个 Rust 函数为 WebAssembly,并在 WasmEdge 中运行。