# ssh-rs ✨
[](https://github.com/1148118271/ssh-rs/actions/workflows/build.yml)
[](https://docs.rs/ssh-rs/latest/)
[](LICENSE)
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
* `chacha20-poly1305@openssh.com`
* `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`
* `zlib@openssh.com`
* `zlib` (behind feature "zlib")
---
### ☃️ Additional algorithms will continue to be added.