我需要通过ssh读取一些文件,但是当我在文件上循环读取时.它停止了。
在我的Cargo.toml中,我有一个依赖项:
[dependencies]
ssh2 = "0.8"这取决于libssh2。
代码更复杂,但我成功地再现了这个脏代码的问题:
use std::fs::File;
use std::io::Read;
use std::io::Write;
#[allow(unused_imports)]
use std::io::Error;
use std::net::TcpStream;
use ssh2::Session;
use std::path::Path;
use std::io::prelude::*;
fn main() {
println!("Parto!");
let tcp = TcpStream::connect("myhost:22").unwrap();
let mut sess = Session::new().unwrap();
sess.set_tcp_stream(tcp);
sess.handshake().unwrap();
sess.userauth_password("user", "password").unwrap();
assert!(sess.authenticated());
let (mut remote_file, stat) = sess.scp_recv(Path::new("/home/pi/dbeaver.exe")).unwrap();
println!("remote file size: {}", stat.size());
let mut buf: Vec<u8> = vec![0;1000];
loop {
let read_bytes = remote_file.read(&mut buf).unwrap();
println!("Read bytes: {}.", read_bytes);
if read_bytes < 1000 {
break;
}
} //ending loop
}我在Windows 10和Linux上都进行了测试。当文件大于几KB时,问题总是存在。
let read_bytes = remote_file.read(&mut buf).unwrap();读取小于缓冲区大小(但文件未结束)。
使用二进制或asci文件进行测试。
没有错误,它只是停止阅读。奇怪的是:它有时停在8 MB,有时在16 KB。有同样的文件和主机..。
我要在哪里挖或者我需要检查什么?
发布于 2020-10-20 07:35:25
引用io::读特性的文档( ssh2实现了该特性):
如果返回的值n小于缓冲区大小,即使读取器尚未在流的末尾,也不是错误。例如,这可能是因为现在实际可用的字节较少(例如,接近文件结束),或者因为read()被信号中断。
由于您正在远程读取,这可能只是意味着剩余的字节仍在网络中传输,并且尚未在目标计算机上可用。
如果您确信有足够的传入数据来填充缓冲区,则可以使用read_exact,但请注意,如果可用数据比缓冲区短,这将返回一个错误。
编辑:或者更好的是,使用read_to_end,它不需要事先知道大小(我不知道为什么昨天我写原始答案时看不到它)。
https://stackoverflow.com/questions/64433067
复制相似问题