如何在 Rust 中将提示输入发送到 std::process::Command?

How to send prompt input to std::process::Command in rust?

我正在编写一个用于自动安装 archlinux 的 cli 工具,它基于 toml 配置文件...

目前我有这个问题...安装并配置基本系统后,下一步是创建用户并设置用户密码。

通常bash会像这样

passwd $user

这需要获取密码作为提示输入

New password:

我正在尝试做这样的东西

use std::process::Command;

struct User {
    ....
    username: String
    pwd: String
}

...

fn set_pwd(self) -> Result<()> {
    Command::new("chroot")
        .arg("/mnt")
        .arg("passwd")
        .arg(self.username)
        .spawn()
}
...

问题是我不明白如何将密码作为提示输入传递给 bash 进程

更新

这个问题https://Whosebug.coam/questions/21615188/how-to-send-input-to-a-program-through-stdin-in-rust解决了类似的问题,但实现有点不同,因为它是一段时间以前的标准库版本,但它是一个很好的基础

最后我根据这个问题How to send input to a program through stdin in Rust

最后这个方法看起来像这样...

    fn set_pwd(self) -> Result<()> {
        match Command::new("chroot")
            .stdin(Stdio::piped())
            .arg("/mnt")
            .arg("passwd")
            .arg(self.username)
            .spawn()
        {
            Ok(mut child) => {
                let pwd = format!("{}\n{}", self.pwd, self.pwd);
                child.stdin.as_ref().unwrap().write(pwd.as_bytes()).unwrap();
                child.wait().unwrap();
                Ok(())
            }
            Err(_e) => Err(()),
        }
    }

与另一个问题的不同之处在于,std::process::ChildStdin 不使用 BuffWriterwrite! 宏,而是实现 std::io::Write 特性并提供 write方法。