如何在 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
不使用 BuffWriter
和 write!
宏,而是实现 std::io::Write
特性并提供 write
方法。
我正在编写一个用于自动安装 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
不使用 BuffWriter
和 write!
宏,而是实现 std::io::Write
特性并提供 write
方法。