Итак, я пытаюсь восстановить сценарий 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;
}
@PitaJ Я пробовал оба, да, в обоих случаях ничего не получается
Удалите .stdout(process::Stdio::piped()) и замените .output() на .status().
Это просто дает мне код выхода, который мне не нужен, я хочу, чтобы стандартный вывод команды был виден пользователю
Чтобы stdout был виден пользователю, проще всего не захватывать его самому, а просто пропустить, что и происходит, если вы не вызываете .stdout или .output, а просто .status (площадка).
@Jmb Я вижу, это делает то, что я хочу, мой плохой. Огромное спасибо. Есть ли способ передать пароль при запросе? Будет ли это с .stdin(Stdio::piped()) ?
@Jmb также не стесняйтесь писать это как реальный ответ, чтобы я мог его принять.

Чтобы стандартный вывод был виден пользователю, проще всего не захватывать его самостоятельно, а просто пропустить, что и происходит, если вы не вызываете ни .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();
}
Получается, он запрашивает пароль, но канал не записывает в позицию пароля? Он ждет ввода, что может быть с этим связано? Или это похоже на прохождение, прежде чем он спросит
Я не уверен, что вы называете пароль «позицией». В процессах stdin/stdout нет понятия "позиция". Если пароль не взят, вы отправляете \n после пароля (для имитации ключа <return>)? В противном случае вам, возможно, придется задать новый вопрос и показать нам код, который вы используете для отправки пароля.
Какой результат вы получаете? А вы пробовали без
.stdout(process::Stdio::piped())? Что вы пытались проверить вывод stderr?