Используйте Rust для подключения к удаленным серверам Linux, отправки файлов и выполнения команд.

Используйте 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

3. Файл сервера

изображение-20230708204644799

Guess you like

Origin blog.csdn.net/qq_29689343/article/details/131616320