Используйте Rust для подключения к удаленным серверам Linux, отправки файлов и выполнения команд.
Каталог статей
1. Обзор Rust
Я слышал Rust бесчисленное количество раз, и мне ясно, что он сильный! Но я также только что узнал, что учиться труднее! А как насчет добавления ChatGPT? Следующий код был написан с благословения ChatGPT, я сыграл лишь вспомогательную роль! Скажем так, они великолепны!
Rust (также известный как язык программирования Rust) — это язык системного программирования, который в основном используется для разработки базовых систем и приложений, таких как операционные системы, сетевые протоколы, компиляторы и т. д.
сцены, которые будут использоваться
- Системное программирование: Rust подходит для написания системных программ низкого уровня, таких как операционные системы, сетевые протоколы и драйверы.
- Параллельное программирование. Модель параллелизма и механизмы управления памятью Rust делают его отличным выбором для параллельного программирования.
- Встроенные системы. Производительность и надежность Rust делают его широко используемым во встроенных системах.
- Безопасность: Rust предоставляет надежные функции безопасности, такие как безопасность памяти, предотвращение гонок за данными и т. д., что делает его идеальным выбором для написания критически важных с точки зрения безопасности приложений. Преимущества и недостатки:
преимущество
- Безопасность памяти: Rust обеспечивает гарантии безопасности памяти, избегая распространенных проблем, таких как утечки памяти и доступ за пределами памяти.
- Высокая производительность: производительность Rust близка к производительности C++, что делает его подходящим для сценариев с высокими требованиями к производительности.
- Параллелизм: возможности параллельного программирования Rust мощны и подходят для разработки многопоточных приложений.
- Надежность: механизмы обработки ошибок и управления памятью Rust делают приложения более надежными.
- Простота: синтаксис Rust краток и прост в освоении.
недостаток
- Кривая обучения: синтаксис и концепции Rust относительно новы , и тем, кто знаком с другими языками программирования, может потребоваться некоторое привыкание.
- Библиотечная экосистема. Хотя стандартная библиотечная экосистема Rust хорошо развита, могут быть области, где библиотеки еще незрелы.
- Система статических типов. Хотя статическая типизация помогает повысить удобство сопровождения и читаемость кода, она также может ограничить гибкость кода.
2. Реализация функции
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-rust
Finished dev [unoptimized + debuginfo] target(s) in 0.03s
Running `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