1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 使用 Rust 实现连接远程 Linux 服务器 发送文件 执行命令

使用 Rust 实现连接远程 Linux 服务器 发送文件 执行命令

时间:2019-12-12 05:05:52

相关推荐

使用 Rust 实现连接远程 Linux 服务器 发送文件 执行命令

使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令

文章目录

使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令一、Rust 概述使用场景优点缺点 二、功能实现1、代码2、运行日志3、服务器文件

一、Rust 概述

Rust 已经听了无数遍,我很清楚它很强!但我也刚了解到它比较难学!那么加上 ChatGPT 呢?下面的代码就是在 ChatGPT 加持下写出来的,我只起到了辅助作用!只能说它们都很厉害!

Rust(又称为 Rust programming language)是一种系统编程语言,主要用于开发底层系统和应用程序,如操作系统、网络协议、编译器等。

使用场景

系统编程:Rust 适用于编写操作系统、网络协议、驱动程序等底层系统程序。并行编程:Rust 的并发模型和内存管理机制使其成为并行编程的优秀选择。嵌入式系统:Rust 的性能和可靠性使其在嵌入式系统中得到广泛应用。安全性:Rust 提供了强大的安全功能,如内存安全、防止数据竞争等,使其成为编写安全关键应用程序的选择。优缺点:

优点

内存安全:Rust 提供了内存安全保证,避免了常见的内存泄漏、越界访问等问题。高性能:Rust 的性能接近于 C++,使得其适用于对性能要求较高的场景。并行性:Rust 的并发编程能力强大,适合于开发多线程应用程序。可靠性:Rust 的错误处理机制和内存管理机制使得应用程序更加可靠。简洁性:Rust 的语法简洁明了,易于学习。

缺点

学习曲线:Rust 的语法和概念较为新颖,对于熟悉其他编程语言的人来说,可能需要一些时间来适应。库生态系统:尽管 Rust 的标准库生态系统较为完善,但在某些特定领域的库可能还不够成熟。静态类型系统:虽然静态类型有助于增强代码的可维护性和可读性,但也可能会限制代码的灵活性。

二、功能实现

1、代码

依赖 ssh2

ssh2 = “0.9.4”

#![allow(unused_assignments)] // 禁用未使用赋值的警告use std::io::{Read, Write};use std::path::Path;use ssh2::Session;const PROGRESS_UPDATE_INTERVAL: usize = 1024 * 1024; // 每传输 1MB 打印一次进度信息fn main() {// 连接远程服务器let tcp = std::net::TcpStream::connect("222.222.222.222:22").unwrap(); // 连接到远程服务器let mut sess = Session::new().unwrap(); // 创建一个新的会话sess.set_tcp_stream(tcp); // 设置会话的 TCP 流sess.handshake().unwrap(); // 进行握手sess.userauth_password("root", "222222222").unwrap(); // 使用用户名和密码进行身份验证// 执行远程命令let mut channel = sess.channel_session().unwrap(); // 创建一个新的会话通道channel.exec("pwd").unwrap(); // 执行命令let mut output = Vec::new(); // 创建一个空的字节向量channel.read_to_end(&mut output).unwrap(); // 读取命令输出println!("{}", String::from_utf8_lossy(&output)); // 打印命令输出// 传输文件let local_file_path = "C:\\Users\\Administrator\\Desktop\\app.jar"; // 本地文件路径let remote_file_path = "/home/zibo/app.jar"; // 远程文件路径let file_size = get_file_size(local_file_path); // 获取文件大小let mut channel = sess.scp_send(Path::new(remote_file_path), 0o644, file_size, None).unwrap(); // 创建一个新的 SCP 通道let mut file = std::fs::File::open(local_file_path).unwrap(); // 打开本地文件let mut buffer = Vec::new(); // 创建一个空的字节向量file.read_to_end(&mut buffer).unwrap(); // 读取文件内容let mut total_bytes_sent = 0; // 已发送的总字节数let mut total_mb = (file_size as f64) / (1024.0 * 1024.0); // 文件总大小(MB)total_mb = (total_mb * 100.0).round() / 100.0; // 保留2位小数let mut transferred_mb = 0.0; // 已传输的文件大小(MB)// 记录已发送文件的大小let mut bytes_sent = 0; // 已发送的字节数for (i, chunk) in buffer.chunks(PROGRESS_UPDATE_INTERVAL).enumerate() {// 循环发送文件内容// 循环发送,发完为止!while bytes_sent < chunk.len() {let result = channel.write(chunk).unwrap(); // 发送文件内容bytes_sent += result; // 更新已发送的字节数}total_bytes_sent += bytes_sent; // 更新已发送的总字节数bytes_sent = 0; // 重置已发送的字节数transferred_mb = (total_bytes_sent as f64) / (1024.0 * 1024.0); // 更新已传输的文件大小(MB)transferred_mb = (transferred_mb * 100.0).round() / 100.0; // 保留2位小数if (i + 1) * PROGRESS_UPDATE_INTERVAL <= buffer.len() {// 如果还有剩余的文件内容需要发送let progress = (total_bytes_sent as f64) / (file_size as f64) * 100.0; // 计算传输进度println!("进度: {:.2}% ({:.2} MB / {:.2} MB)", progress, transferred_mb, total_mb); // 打印传输进度信息} else {// 文件传输完毕println!("进度: 100% 文件传输完毕!");}}channel.send_eof().unwrap(); // 发送 EOF 标志}// 获取文件大小fn get_file_size(file_path: &str) -> u64 {std::fs::metadata(file_path) // 获取文件元数据.map(|metadata| metadata.len()) // 获取文件大小.unwrap_or(0) // 如果获取失败,则返回 0}

2、运行日志

C:/Users/Administrator/.cargo/bin/cargo.exe run --color=always --package hello-rust --bin hello-rustFinished dev [unoptimized + debuginfo] target(s) in 0.03sRunning `target\debug\hello-rust.exe`/root进度: 23.10% (1.03 MB / 4.46 MB)进度: 46.20% (2.06 MB / 4.46 MB)进度: 69.30% (3.09 MB / 4.46 MB)进度: 92.40% (4.12 MB / 4.46 MB)进度: 100% 文件传输完毕!Process finished with exit code 0

3、服务器文件

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。