【问题标题】:How to send prompt input to std::process::Command in rust?如何在 rust 中向 std::process::Command 发送提示输入?
【发布时间】:2021-12-27 10:41:58
【问题描述】:

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

目前我遇到了这个问题...一旦安装并配置了基本系统,接下来就是创建用户并设置用户密码。

通常使用 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://stackoverflow.coam/questions/21615188/how-to-send-input-to-a-program-through-stdin-in-rust解决了类似的问题,但实现有点不同,因为它是一段时间前的标准库版本,但它是一个很好的基础

【问题讨论】:

  • 该工具最初不与用户交互,用户将所有配置(包括用户信息)写入 toml 配置文件中......然后该工具使所有工作都与该信息一起工作
  • Arch Linux useradd 实用程序似乎支持使用 -p 选项设置密码。
  • useradd 实用程序适用于我的目的,但我仍然有如何设置 root 密码的问题

标签: bash rust arch


【解决方案1】:

最后我基于这个问题https://stackoverflow.coam/questions/21615188/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 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2021-06-13
    • 2014-07-25
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多