Как получить весь вывод process::Command

Итак, я пытаюсь восстановить сценарий bash, который я сделал с помощью ржавчины (позволяет хэшировать и настраивать). Кажется, я не могу получить вывод команды на свой терминал, и я просто не могу понять, что я делаю неправильно. Я уже пробовал подключать stdout многими разными способами, и я остановился.

Я хотел бы видеть эту часть и в командной строке, но просто чтобы все это заполнялось автоматически (и да, я знаю, что ключи ssh существуют, лол)

user@server's password:
ibits.c                                                                  100% 1137   271.2KB/s   00:00
fn auto_scp(flags: FlagOptions, f_path: String) {
    let info = open_config();
    let mut args: Vec<String> = vec![];
    if flags.is_folder {
        args.push(String::from("-r"))
    }
    if flags.d_load {
        let path = info.rmt_hst+":"+&f_path;
        // println!("{}",path);
        args.push(path);
        args.push(info.ddest);
    } else {
        let path = info.rmt_hst+":"+&info.udest;
        // println!("{}",path);
        args.push(f_path);
        args.push(path);
    }
    let mut com = process::Command::new("/bin/scp")
                                  .args(args)
                                  .stdout(process::Stdio::piped())
                                  .output()
                                  .expect("stuff");
    // io::stdout().write_all(b"hello world\n");
                                  // .expect("Could not output");
    // let stdout = String::from_utf8(com.stdout).unwrap();
    println!("stdout: {}", String::from_utf8(&com.stdout));
    // io::stdout().write_all(&outc.stdout).unwrap();
    println!("{}", stdout);
    return;
}

Какой результат вы получаете? А вы пробовали без .stdout(process::Stdio::piped())? Что вы пытались проверить вывод stderr?

PitaJ 04.11.2022 19:24

@PitaJ Я пробовал оба, да, в обоих случаях ничего не получается

ConnerWithAnE 04.11.2022 19:43

Удалите .stdout(process::Stdio::piped()) и замените .output() на .status().

Jmb 04.11.2022 19:46

Это просто дает мне код выхода, который мне не нужен, я хочу, чтобы стандартный вывод команды был виден пользователю

ConnerWithAnE 04.11.2022 19:55

Чтобы stdout был виден пользователю, проще всего не захватывать его самому, а просто пропустить, что и происходит, если вы не вызываете .stdout или .output, а просто .status (площадка).

Jmb 04.11.2022 20:01

@Jmb Я вижу, это делает то, что я хочу, мой плохой. Огромное спасибо. Есть ли способ передать пароль при запросе? Будет ли это с .stdin(Stdio::piped()) ?

ConnerWithAnE 04.11.2022 20:10

@Jmb также не стесняйтесь писать это как реальный ответ, чтобы я мог его принять.

ConnerWithAnE 04.11.2022 20:21
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
7
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы стандартный вывод был виден пользователю, проще всего не захватывать его самостоятельно, а просто пропустить, что и происходит, если вы не вызываете ни .stdout, ни .output, а просто .status или .spawn:

fn main() {
    std::process::Command::new ("/usr/bin/echo")
        .arg ("Hello world")
        .status()
        .unwrap();
}

Детская площадка

Если вы хотите передать входные данные дочернему процессу (например, пароль), вам нужно вызвать .stdin (Stdio::piped()) перед созданием дочернего процесса (с помощью .spawn), что даст вам дочерний дескриптор, поле stdin которого можно использовать для записи в ребенок:

use std::io::Write;
use std::process::{ Command, Stdio, };

fn main() {
    let mut child = Command::new ("/usr/bin/cat")
        .stdin (Stdio::piped())
        .spawn()
        .unwrap();
    let mut pipe = child.stdin.take().unwrap();
    pipe.write_all ("hello world".as_bytes()).unwrap();
    drop (pipe); // So that `cat` will exit
    child.wait().unwrap();
}

Детская площадка

Получается, он запрашивает пароль, но канал не записывает в позицию пароля? Он ждет ввода, что может быть с этим связано? Или это похоже на прохождение, прежде чем он спросит

ConnerWithAnE 04.11.2022 20:50

Я не уверен, что вы называете пароль «позицией». В процессах stdin/stdout нет понятия "позиция". Если пароль не взят, вы отправляете \n после пароля (для имитации ключа <return>)? В противном случае вам, возможно, придется задать новый вопрос и показать нам код, который вы используете для отправки пароля.

Jmb 05.11.2022 08:15

Другие вопросы по теме