0

我正在尝试这样做:

# 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()?;

随着输出被捕获和隐藏,这变得接近了。然而,虽然用户可以在技术上输入密码,并且它将继续执行命令,但“输入密码:”提示是隐藏的,因此用户可能不知道他们确实可以输入密码。

4

0 回答 0