使用 Rust 實(shí)現(xiàn)連接遠(yuǎn)程 Linux 服務(wù)器、發(fā)送文件、執(zhí)行命令
一、Rust 概述
Rust 已經(jīng)聽(tīng)了無(wú)數(shù)遍,我很清楚它很強(qiáng)!但我也剛了解到它比較難學(xué)!那么加上 ChatGPT 呢?下面的代碼就是在 ChatGPT 加持下寫出來(lái)的,我只起到了輔助作用!只能說(shuō)它們都很厲害!
Rust(又稱為 Rust programming language)是一種系統(tǒng)編程語(yǔ)言,主要用于開(kāi)發(fā)底層系統(tǒng)和應(yīng)用程序,如操作系統(tǒng)、網(wǎng)絡(luò)協(xié)議、編譯器等。
使用場(chǎng)景
- 系統(tǒng)編程:Rust 適用于編寫操作系統(tǒng)、網(wǎng)絡(luò)協(xié)議、驅(qū)動(dòng)程序等底層系統(tǒng)程序。
- 并行編程:Rust 的并發(fā)模型和內(nèi)存管理機(jī)制使其成為并行編程的優(yōu)秀選擇。
- 嵌入式系統(tǒng):Rust 的性能和可靠性使其在嵌入式系統(tǒng)中得到廣泛應(yīng)用。
- 安全性:Rust 提供了強(qiáng)大的安全功能,如內(nèi)存安全、防止數(shù)據(jù)競(jìng)爭(zhēng)等,使其成為編寫安全關(guān)鍵應(yīng)用程序的選擇。優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
- 內(nèi)存安全:Rust 提供了內(nèi)存安全保證,避免了常見(jiàn)的內(nèi)存泄漏、越界訪問(wèn)等問(wèn)題。
- 高性能:Rust 的性能接近于 C++,使得其適用于對(duì)性能要求較高的場(chǎng)景。
- 并行性:Rust 的并發(fā)編程能力強(qiáng)大,適合于開(kāi)發(fā)多線程應(yīng)用程序。
- 可靠性:Rust 的錯(cuò)誤處理機(jī)制和內(nèi)存管理機(jī)制使得應(yīng)用程序更加可靠。
- 簡(jiǎn)潔性:Rust 的語(yǔ)法簡(jiǎn)潔明了,易于學(xué)習(xí)。
缺點(diǎn)
- 學(xué)習(xí)曲線:Rust 的語(yǔ)法和概念較為新穎,對(duì)于熟悉其他編程語(yǔ)言的人來(lái)說(shuō),可能需要一些時(shí)間來(lái)適應(yīng)。
- 庫(kù)生態(tài)系統(tǒng):盡管 Rust 的標(biāo)準(zhǔn)庫(kù)生態(tài)系統(tǒng)較為完善,但在某些特定領(lǐng)域的庫(kù)可能還不夠成熟。
- 靜態(tài)類型系統(tǒng):雖然靜態(tài)類型有助于增強(qiáng)代碼的可維護(hù)性和可讀性,但也可能會(huì)限制代碼的靈活性。
二、功能實(shí)現(xiàn)
1、代碼
依賴 ssh2
ssh2 = “0.9.4”文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-535966.html
#![allow(unused_assignments)] // 禁用未使用賦值的警告
use std::io::{Read, Write};
use std::path::Path;
use ssh2::Session;
const PROGRESS_UPDATE_INTERVAL: usize = 1024 * 1024; // 每傳輸 1MB 打印一次進(jìn)度信息
fn main() {
// 連接遠(yuǎn)程服務(wù)器
let tcp = std::net::TcpStream::connect("222.222.222.222:22").unwrap(); // 連接到遠(yuǎn)程服務(wù)器
let mut sess = Session::new().unwrap(); // 創(chuàng)建一個(gè)新的會(huì)話
sess.set_tcp_stream(tcp); // 設(shè)置會(huì)話的 TCP 流
sess.handshake().unwrap(); // 進(jìn)行握手
sess.userauth_password("root", "222222222").unwrap(); // 使用用戶名和密碼進(jìn)行身份驗(yàn)證
// 執(zhí)行遠(yuǎn)程命令
let mut channel = sess.channel_session().unwrap(); // 創(chuàng)建一個(gè)新的會(huì)話通道
channel.exec("pwd").unwrap(); // 執(zhí)行命令
let mut output = Vec::new(); // 創(chuàng)建一個(gè)空的字節(jié)向量
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"; // 遠(yuǎn)程文件路徑
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(); // 創(chuàng)建一個(gè)新的 SCP 通道
let mut file = std::fs::File::open(local_file_path).unwrap(); // 打開(kāi)本地文件
let mut buffer = Vec::new(); // 創(chuàng)建一個(gè)空的字節(jié)向量
file.read_to_end(&mut buffer).unwrap(); // 讀取文件內(nèi)容
let mut total_bytes_sent = 0; // 已發(fā)送的總字節(jié)數(shù)
let mut total_mb = (file_size as f64) / (1024.0 * 1024.0); // 文件總大?。∕B)
total_mb = (total_mb * 100.0).round() / 100.0; // 保留2位小數(shù)
let mut transferred_mb = 0.0; // 已傳輸?shù)奈募笮。∕B)
// 記錄已發(fā)送文件的大小
let mut bytes_sent = 0; // 已發(fā)送的字節(jié)數(shù)
for (i, chunk) in buffer.chunks(PROGRESS_UPDATE_INTERVAL).enumerate() { // 循環(huán)發(fā)送文件內(nèi)容
// 循環(huán)發(fā)送,發(fā)完為止!
while bytes_sent < chunk.len() {
let result = channel.write(chunk).unwrap(); // 發(fā)送文件內(nèi)容
bytes_sent += result; // 更新已發(fā)送的字節(jié)數(shù)
}
total_bytes_sent += bytes_sent; // 更新已發(fā)送的總字節(jié)數(shù)
bytes_sent = 0; // 重置已發(fā)送的字節(jié)數(shù)
transferred_mb = (total_bytes_sent as f64) / (1024.0 * 1024.0); // 更新已傳輸?shù)奈募笮。∕B)
transferred_mb = (transferred_mb * 100.0).round() / 100.0; // 保留2位小數(shù)
if (i + 1) * PROGRESS_UPDATE_INTERVAL <= buffer.len() { // 如果還有剩余的文件內(nèi)容需要發(fā)送
let progress = (total_bytes_sent as f64) / (file_size as f64) * 100.0; // 計(jì)算傳輸進(jìn)度
println!("進(jìn)度: {:.2}% ({:.2} MB / {:.2} MB)", progress, transferred_mb, total_mb); // 打印傳輸進(jìn)度信息
} else { // 文件傳輸完畢
println!("進(jìn)度: 100% 文件傳輸完畢!");
}
}
channel.send_eof().unwrap(); // 發(fā)送 EOF 標(biāo)志
}
// 獲取文件大小
fn get_file_size(file_path: &str) -> u64 {
std::fs::metadata(file_path) // 獲取文件元數(shù)據(jù)
.map(|metadata| metadata.len()) // 獲取文件大小
.unwrap_or(0) // 如果獲取失敗,則返回 0
}
2、運(yùn)行日志
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
進(jìn)度: 23.10% (1.03 MB / 4.46 MB)
進(jìn)度: 46.20% (2.06 MB / 4.46 MB)
進(jìn)度: 69.30% (3.09 MB / 4.46 MB)
進(jìn)度: 92.40% (4.12 MB / 4.46 MB)
進(jìn)度: 100% 文件傳輸完畢!
Process finished with exit code 0
3、服務(wù)器文件
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-535966.html
到了這里,關(guān)于使用 Rust 實(shí)現(xiàn)連接遠(yuǎn)程 Linux 服務(wù)器、發(fā)送文件、執(zhí)行命令的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!