Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

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

Rust implementation of ssh2.0 client 👻 rust实现的ssh2.0客户端
https://github.com/1148118271/ssh-rs

rust ssh ssh-client ssh2

Last synced: 3 days ago
JSON representation

Rust implementation of ssh2.0 client 👻 rust实现的ssh2.0客户端

Awesome Lists containing this project

README

        

# ssh-rs ✨

[![Build](https://github.com/1148118271/ssh-rs/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/1148118271/ssh-rs/actions/workflows/build.yml)
[![API Docs](https://docs.rs/ssh-rs/badge.svg)](https://docs.rs/ssh-rs/latest/)
[![LICENSE](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)

[English](https://github.com/1148118271/ssh-rs/blob/main/README.md) | [简体中文](https://github.com/1148118271/ssh-rs/blob/main/README_ZH.md)

Rust implementation of ssh2.0 client.

If you encounter any problems in use, welcome [issues](https://github.com/1148118271/ssh-rs/issues)
or [PR](https://github.com/1148118271/ssh-rs/pulls) .

## Content

* [ssh-rs ✨](#ssh-rs)
+ [Content](#content)
+ [Connection method:](#connection-method)
- [1. Password:](#1-password)
- [2. Public key:](#2-public-key)
- [1. Use key file path:](#1-use-key-file-path)
- [2. Use key string:](#2-use-key-string)
- [3. Use them together](#3-use-them-together)
+ [Enable global logging:](#enable-global-logging)
+ [Set timeout:](#set-timeout)
+ [How to use:](#how-to-use)
+ [Algorithm support:](#algorithm-support)
- [1. Kex algorithms](#1-kex-algorithms)
- [2. Server host key algorithms](#2-server-host-key-algorithms)
- [3. Encryption algorithms (client to server)](#3-encryption-algorithms-client-to-server)
- [4. Encryption algorithms (server to client)](#4-encryption-algorithms-server-to-client)
- [5. Mac algorithms (client to server)](#5-mac-algorithms-client-to-server)
- [6. Mac algorithms (server to client)](#6-mac-algorithms-server-to-client)
- [7. Compression algorithms (client to server)](#7-compression-algorithms-client-to-server)
- [8. Compression algorithms (server to client)](#8-compression-algorithms-server-to-client)
- [☃️ Additional algorithms will continue to be added.](#️-additional-algorithms-will-continue-to-be-added)

## Connection method:

### 1. Password:

```rust
use ssh;

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

### 2. Public key:

* **Currently, only RSA, ED25519 keys/key files are supported.**

#### 1. Use key file path:

```rust
// 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. Use key string:

```rust
// 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. Use them together

* According to the implementation of OpenSSH, it will try public key first and fallback to password. So both of them can be provided.

```Rust
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();
```

## Enable global logging:

* This crate now uses the `log` compatible `tracing` for logging functionality

```rust
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");
```

## Set timeout:

* Only global timeouts per r/w are currently supported.

```rust
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!(),
}
```

## How to use:

* Examples can be found under [examples](examples)

1. [Execute a command](examples/exec/src/main.rs)
2. [Scp files](examples/scp/src/main.rs)
3. [Run a shell](examples/shell/src/main.rs)
4. [Run an interactive shell](examples/shell_interactive/src/main.rs)
5. [Connect ssh server w/o a tcp stream](examples/bio/src/main.rs)
6. [Cofigure your own algorithm list](examples/customized_algorithms/src/main.rs)

## Algorithm support:

### 1. Kex algorithms

* `curve25519-sha256`
* `ecdh-sha2-nistp256`
* `diffie-hellman-group14-sha256`
* `diffie-hellman-group14-sha1`
* `diffie-hellman-group1-sha1` (behind feature "deprecated-dh-group1-sha1")

### 2. Server host key algorithms

* `ssh-ed25519`
* `rsa-sha2-256`
* `rsa-sha2-512`
* `rsa-sha` (behind feature "deprecated-rsa-sha1")
* `ssh-dss` (behind feature "deprecated-dss-sha1")

### 3. Encryption algorithms

* `[email protected]`
* `aes128-ctr`
* `aes192-ctr`
* `aes256-ctr`
* `aes128-cbc` (behind feature "deprecated-aes-cbc")
* `aes192-cbc` (behind feature "deprecated-aes-cbc")
* `aes256-cbc` (behind feature "deprecated-aes-cbc")
* `3des-cbc` (behind feature "deprecated-des-cbc")

### 4. Mac algorithms

* `hmac-sha2-256`
* `hmac-sha2-512`
* `hmac-sha1`

### 5. Compression algorithms

* `none`
* `[email protected]`
* `zlib` (behind feature "zlib")

---

### ☃️ Additional algorithms will continue to be added.