rust - 如何在不将数据读入内存的情况下将 ssh2::Stream 写入文件?

标签 rust stream ssh2

我正在尝试使用 ssh2 通过 SCP 下载一个大型二进制文件箱 v0.3.3

extern crate ssh2;

use std::net::TcpStream;
use ssh2::Session;
use std::path::Path;
use std::fs::File;
use indicatif::ProgressBar;

fn main() -> Result<(), Box<std::error::Error>> {
    let ssh_host_port = "prokerala.com:22";
    let ssh_user = "prokeral";
    let remote_temp_file = "/tmp/dbimport_Rk6Iwwm5.sql.bz2";

    let tcp = TcpStream::connect(&ssh_host_port).unwrap();
    let mut sess = Session::new().unwrap();
    sess.handshake(&tcp).expect("SSH handshake failed");
    let _ = sess.userauth_agent(ssh_user);

    let path = Path::new(&remote_temp_file);
    let (mut remote_file, stat) = sess.scp_recv(path).unwrap();

    let stream:ssh2::Stream = remote_file.stream(1);

    // Update: solved by using io::copy as suggested by @apemanzilla below
    // let mut target = File::create("/tmp/done.txt").unwrap();
    // let pb = ProgressBar::new(stat.size());
    // std::io::copy(&mut pb.wrap_read(remote_file), &mut target)?;
    Ok(())
}

我想将 stream 写入一个文件,并显示一个进度条。是否可以直接将 stream 写入文件,而无需在循环中使用 stream.read() 将数据读入内存?

最佳答案

因为 Stream 实现了 Read,你应该能够只使用 std::io::copy(&mut stream, &mut File::create(. ..).unwrap()) 将所有数据复制到文件中。如果你想要一个进度条,我建议使用 indicatif crate ,里面有一个 method to wrap a Read instance ,在读取数据时自动更新进度条。

关于rust - 如何在不将数据读入内存的情况下将 ssh2::Stream 写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57134077/

相关文章:

php - Composer :在phpseclib SSH2中找不到命令

rust - 将 `#![no_std]` 添加到库时,该库的用户是否有任何缺点或复杂性?

iOS 流媒体背景音频

c# - 可以让 C# SSH 客户端与 NodeJS SSH 服务器通信吗?

c++ - BASS "Play"流

linux - 管道 sox 播放命令到标准输出

rust - 创建具有无限参数的宏

rust - 如何通过原始指针将闭包作为参数传递给 C 函数?

generics - 为什么我不能在带有类型参数的特征上添加一揽子实现?