diff --git a/README.md b/README.md index bfc90df..d59658c 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,7 @@ Project or files: │   ├── flatbuffers │   └── serde_json ├── __shell +│   ├── ssh2 │   └── xshell ├── __std │   ├── async_await @@ -137,7 +138,7 @@ Project or files: ├── vec.rs └── while.rs -109 directories, 26 files +110 directories, 26 files ``` diff --git a/__shell/ssh2/Cargo.lock b/__shell/ssh2/Cargo.lock new file mode 100644 index 0000000..bdf7eaf --- /dev/null +++ b/__shell/ssh2/Cargo.lock @@ -0,0 +1,183 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "cc" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95752358c8f7552394baf48cd82695b345628ad3f170d607de3ca03b8dacca15" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "libc" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614" + +[[package]] +name = "libssh2-sys" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca46220853ba1c512fc82826d0834d87b06bcd3c2a42241b7de72f3d2fe17056" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "602113192b08db8f38796c4e85c39e960c145965140e918018bcde1952429655" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "lock_api" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "openssl-sys" +version = "0.9.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a842db4709b604f0fe5d1170ae3565899be2ad3d9cbc72dedc789ac0511f78de" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking_lot" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" +dependencies = [ + "cfg-if", + "cloudabi", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "pkg-config" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "smallvec" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7acad6f34eb9e8a259d3283d1e8c1d34d7415943d4895f65cc73813c7396fc85" + +[[package]] +name = "ssh2" +version = "0.1.0" +dependencies = [ + "ssh2 0.8.3", +] + +[[package]] +name = "ssh2" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c516996bbb84de5dba6e118406c1e1429111cfb4d844e20e1290e5b6ebe6ad5" +dependencies = [ + "bitflags", + "libc", + "libssh2-sys", + "parking_lot", +] + +[[package]] +name = "vcpkg" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/__shell/ssh2/Cargo.toml b/__shell/ssh2/Cargo.toml new file mode 100644 index 0000000..76f8b72 --- /dev/null +++ b/__shell/ssh2/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "ssh2" +version = "0.1.0" +authors = ["Hatter Jiang "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +ssh2 = "0.8.3" + diff --git a/__shell/ssh2/src/main.rs b/__shell/ssh2/src/main.rs new file mode 100644 index 0000000..99d35a8 --- /dev/null +++ b/__shell/ssh2/src/main.rs @@ -0,0 +1,49 @@ +use ssh2::Session; +use std::io::prelude::*; +use std::net::TcpStream; + +// // Connect to the local SSH server +// let tcp = TcpStream::connect("127.0.0.1:22").unwrap(); +// let mut sess = Session::new().unwrap(); +// sess.set_tcp_stream(tcp); +// sess.handshake().unwrap(); +// sess.userauth_password("username", "password").unwrap(); +// assert!(sess.authenticated()); + +// https://docs.rs/ssh2/0.8.3/ssh2/ +fn main() { + // Almost all APIs require a `Session` to be available + let sess = Session::new().unwrap(); + let mut agent = sess.agent().unwrap(); + + // Connect the agent and request a list of identities + agent.connect().unwrap(); + agent.list_identities().unwrap(); + + for identity in agent.identities().unwrap() { + let pubkey = identity.blob(); + println!("{}", identity.comment()); + println!("- {:?}", pubkey); + } + + // Connect to the SSH server + let tcp = TcpStream::connect("hatter.ink:22").unwrap(); + let mut sess = Session::new().unwrap(); + sess.set_tcp_stream(tcp); + sess.handshake().unwrap(); + + // Try to authenticate with the first identity in the agent. + sess.userauth_agent("root").unwrap(); + + // Make sure we succeeded + println!("authenticated: {}", sess.authenticated()); + + // Run command + let mut channel = sess.channel_session().unwrap(); + channel.exec("ls -l --color").unwrap(); + let mut s = String::new(); + channel.read_to_string(&mut s).unwrap(); + println!("{}", s); + channel.wait_close().unwrap(); + println!("{}", channel.exit_status().unwrap()); +} \ No newline at end of file