#ssh #ssh-client #public-key #ssh-agreement

ssh-rs

除了加密库之外,还提供了SSH-2.0客户端协议的纯Rust实现

17个不稳定版本 (4个重大变更)

0.5.0 2023年12月26日
0.4.5 2023年11月17日
0.4.3 2023年10月17日
0.3.2 2023年1月11日
0.1.3 2022年1月17日

#140 in 网络编程

Download history 266/week @ 2024-04-18 296/week @ 2024-04-25 304/week @ 2024-05-02 280/week @ 2024-05-09 314/week @ 2024-05-16 468/week @ 2024-05-23 425/week @ 2024-05-30 439/week @ 2024-06-06 383/week @ 2024-06-13 594/week @ 2024-06-20 529/week @ 2024-06-27 469/week @ 2024-07-04 497/week @ 2024-07-11 367/week @ 2024-07-18 381/week @ 2024-07-25 432/week @ 2024-08-01

每月下载量1,818次
用于 4 crate

MIT许可协议

225KB
5.5K SLoC

ssh-rs ✨

Build API Docs LICENSE

英文 | 简体中文

ssh2.0客户端的Rust实现。

如果在使用过程中遇到任何问题,欢迎提交问题提交PR

内容

连接方法:

1. 密码

use ssh;

let mut session = ssh::create_session()
    .username("ubuntu")
    .password("password")
    .connect("127.0.0.1:22")
    .unwrap();

2. 公钥

  • 目前,仅支持RSA和ED25519密钥/密钥文件。

1. 使用密钥文件路径:

// pem format key path -> /xxx/xxx/id_rsa
// the content of the keyfile shall begin with
//      -----BEGIN RSA PRIVATE KEY----- / -----BEGIN OPENSSH PRIVATE KEY-----
// and end with
//       -----END RSA PRIVATE KEY----- / -----END OPENSSH PRIVATE KEY-----
// simply generated by `ssh-keygen -t rsa -m PEM -b 4096`
use ssh;

let mut session = ssh::create_session()
    .username("ubuntu")
    .private_key_path("./id_rsa")
    .connect("127.0.0.1:22")
    .unwrap();

2. 使用密钥字符串:

// pem format key string:
//      -----BEGIN RSA PRIVATE KEY----- / -----BEGIN OPENSSH PRIVATE KEY-----
// and end with
//       -----END RSA PRIVATE KEY----- / -----END OPENSSH PRIVATE KEY-----
use ssh;

let mut session = ssh::create_session()
    .username("ubuntu")
    .private_key("rsa_string")
    .connect("127.0.0.1:22")
    .unwrap();

3. 同时使用它们

  • 根据OpenSSH的实现,它将首先尝试公钥,然后回退到密码。因此,两者都可以提供。
use ssh;

let mut session = ssh::create_session()
    .username("username")
    .password("password")
    .private_key_path("/path/to/rsa")
    .connect("127.0.0.1:22")
    .unwrap();

启用全局日志记录:

  • 该crate现在使用与log兼容的tracing进行日志记录功能
use tracing::Level;
use tracing_subscriber::FmtSubscriber;

// this will generate some basic event logs
// a builder for `FmtSubscriber`.
let subscriber = FmtSubscriber::builder()
    // all spans/events with a level higher than INFO (e.g, info, warn, etc.)
    // will be written to stdout.
    .with_max_level(Level::INFO)
    // completes the builder.
    .finish();

tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed");

设置超时:

  • 目前仅支持每个r/w的全局超时。
use ssh;

let _listener = TcpListener::bind("127.0.0.1:7777").unwrap();

match ssh::create_session()
    .username("ubuntu")
    .password("password")
    .private_key_path("./id_rsa")
    .timeout(Some(std::time::Duration::from_secs(5)))
    .connect("127.0.0.1:7777")
{
    Err(e) => println!("Got error {}", e),
    _ => unreachable!(),
}

如何使用:

  1. 执行命令
  2. Scp文件
  3. 运行shell
  4. 运行交互式shell
  5. 在不使用tcp流的情况下连接ssh服务器
  6. 配置自己的算法列表

支持的算法:

1. Kex算法

  • curve25519-sha256
  • ecdh-sha2-nistp256
  • diffie-hellman-group14-sha256
  • diffie-hellman-group14-sha1
  • diffie-hellman-group1-sha1(位于“已弃用的dh-group1-sha1”功能之后)

2. 服务器主机密钥算法

  • ssh-ed25519
  • rsa-sha2-256
  • rsa-sha2-512
  • rsa-sha(位于“已弃用的rsa-sha1”功能之后)
  • ssh-dss(位于“已弃用的dss-sha1”功能之后)

3. 加密算法

  • chacha20-poly1305@openssh.com
  • aes128-ctr
  • aes192-ctr
  • aes256-ctr
  • aes128-cbc(位于“已弃用的aes-cbc”功能之后)
  • aes192-cbc(位于“已弃用的aes-cbc”功能之后)
  • aes256-cbc(位于“已弃用的aes-cbc”功能之后)
  • 3des-cbc(位于“已弃用的des-cbc”功能之后)

4. 宏算法

  • hmac-sha2-256
  • hmac-sha2-512
  • hmac-sha1

5. 压缩算法

  • none
  • zlib@openssh.com
  • zlib(位于“zlib”功能之后)

☃️ 将继续添加更多算法。

依赖项

~12–21MB
~399K SLoC