< 返回版块

1148118271 发表于 2022-09-01 11:34

Tags:ssh,ssh2,client

github地址: https://github.com/1148118271/ssh-rs

连接方式:

1. 密码连接:

use ssh_rs::{Session, ssh};

fn main() {
    let mut session: Session = ssh::create_session();
    session.set_user_and_password("用户", "密码");
    session.connect("ip:port").unwrap();
}

2. 公钥连接:

目前只支持加密格式是-----BEGIN RSA PRIVATE KEY-----这种的RSA-PKCS#1-PEM类型的加密文件。

1. 使用密钥文件地址:

use ssh_rs::{Session, ssh};
use ssh_rs::key_pair::KeyPairType;

fn main() {
    let mut session: Session = ssh::create_session();
    // pem格式密钥地址 -> /xxx/xxx/id_rsa
    // KeyPairType::SshRsa rsa类型算法,目前只支持rsa
    session.set_user_and_key_pair_path("用户", "pem格式密钥地址", KeyPairType::SshRsa).unwrap();
    session.connect("ip:port").unwrap();
}    

2. 使用密钥字符串:

use ssh_rs::{Session, ssh};
use ssh_rs::key_pair::KeyPairType;

fn main() {
    let mut session: Session = ssh::create_session();
    // pem格式密钥字符串:
    //      -----BEGIN RSA PRIVATE KEY-----
    //          xxxxxxxxxxxxxxxxxxxxx
    //      -----END RSA PRIVATE KEY-----
    // KeyPairType::SshRsa rsa类型算法,目前只支持rsa
    session.set_user_and_key_pair("用户", "pem格式密钥字符串", KeyPairType::SshRsa).unwrap();
    session.connect("ip:port").unwrap();
}

启用全局日志:

use ssh_rs::{Session, ssh};

fn main() {
    let mut session: Session = ssh::create_session();
    // is_enable_log 是否启用全局日志
    // 默认为 false(不启用)
    // 可设置为 true(启用)
    session.is_enable_log(true);
    session.set_user_and_password("用户", "密码");
    session.connect("ip:port").unwrap();
}

设置超时时间:

use ssh_rs::{Session, ssh};

fn main() {
    let mut session: Session = ssh::create_session();
    // set_timeout 设置超时时间
    // 单位为 秒
    // 默认超时时间是 30秒
    session.set_timeout(15);
    session.set_user_and_password("用户", "密码");
    session.connect("ip:port").unwrap();
}

使用方式:

目前只支持 exec shell scp 这三种功能

1. exec

use ssh_rs::{ChannelExec, Session, ssh};

fn main() {
    let mut session: Session = session();
    // 方式一
    let exec: ChannelExec = session.open_exec().unwrap();
    let vec: Vec<u8> = exec.send_command("ls -all").unwrap();
    println!("{}", String::from_utf8(vec).unwrap());
    // 方式二
    let channel = session.open_channel().unwrap();
    let exec = channel.open_exec().unwrap();
    let vec: Vec<u8> = exec.send_command("ls -all").unwrap();
    println!("{}", String::from_utf8(vec).unwrap());
    // 关闭会话
    session.close().unwrap();
}

2. shell

use std::thread::sleep;
use std::time::Duration;
use ssh_rs::{Channel, ChannelShell, Session, ssh};

fn main() {
    let mut session: Session = session();
    // 方式一
    let mut shell: ChannelShell = session.open_shell().unwrap();
    run_shell(&mut shell);
    // 方式二
    let channel: Channel = session.open_channel().unwrap();
    let mut shell = channel.open_shell().unwrap();
    run_shell(&mut shell);
    // 关闭通道
    shell.close().unwrap();
    // 关闭会话
    session.close().unwrap();
}

fn run_shell(shell: &mut ChannelShell) {
    sleep(Duration::from_millis(500));
    let vec = shell.read().unwrap();
    println!("{}", String::from_utf8(vec).unwrap());

    shell.write(b"ls -all\n").unwrap();

    sleep(Duration::from_millis(500));

    let vec = shell.read().unwrap();
    println!("{}", String::from_utf8(vec).unwrap());
}

3. scp

use ssh_rs::{Channel, ChannelScp, Session, ssh};

fn main() {
    let mut session: Session = session();
    // 方式一
    // 上传
    let scp: ChannelScp = session.open_scp().unwrap();
    scp.upload("本地路径", "远程路径").unwrap();
    // 下载
    let scp: ChannelScp = session.open_scp().unwrap();
    scp.download("本地路径", "远程路径").unwrap();

    // 方式二
    // 上传
    let channel: Channel = session.open_channel().unwrap();
    let scp: ChannelScp = channel.open_scp().unwrap();
    scp.upload("本地路径", "远程路径").unwrap();
    // 下载
    let channel: Channel = session.open_channel().unwrap();
    let scp: ChannelScp = channel.open_scp().unwrap();
    scp.download("本地路径", "远程路径").unwrap();

    session.close().unwrap();
}

评论区

写评论

还没有评论

1 共 0 条评论, 1 页