我正在尝试这样做:
# Call `mysql` from inside a running container named "db"
cargo run my-command "docker exec -it db mysql -u user -p my-database"
这将导致mysql命令显示密码提示并等待用户输入,这正是我想要的。但是,在输入密码并按Enter后,应收集子进程的所有进一步输出,但对用户隐藏。
我试过这个
let args = ["docker", "exec", "-it", "db", "mysql", "-u", "user", "-p"];
// `sudo` only used for testing. It's needed for docker,
// but `sudo cargo run ...` doesn't work
let cmd = process::Command::new("sudo")
.args(&args)
.spawn() // stdout will be inherited
.expect("external cmd failed.")
.wait_with_output()?;
这等待孩子完成,然后打印所有输出,无法过滤它。
我试图在等待孩子完成之前检查输入,但它很恐慌:
let mut cmd = process::Command::new("sudo")
.args(&args)
.spawn()
.expect("external cmd failed.");
let mut s = String::new();
// Trying to inspect the stdout for the if check below,
// but this will panic
let mut out = cmd.stdout.take().unwrap();
out.read_to_string(&mut s);
if s.contains("password") {
// From now on, don't display child's stdout
}
let output = cmd.wait_with_output()?;
let result = String::from_utf8_lossy(&output.stdout);
// do something with the result
我尝试的下一件事是
let mut cmd = process::Command::new("sudo")
.args(&args)
.stdout(process::Stdio::piped())
.spawn()
.expect("external cmd failed.");
let output = cmd.wait_with_output()?;
随着输出被捕获和隐藏,这变得接近了。然而,虽然用户可以在技术上输入密码,并且它将继续执行命令,但“输入密码:”提示是隐藏的,因此用户可能不知道他们确实可以输入密码。