#ssh-client #ssh-config #client-server #bindings #automatic #part #protocols

sys ssh

绑定到 libssh 库,用于编写协议 1 和 2 的客户端和服务器。它还可以解析 SSH 配置文件并自动处理 ProxyCommand。目前仅实现了客户端部分。

5 个版本

使用旧的 Rust 2015

0.1.4 2016 年 2 月 7 日
0.1.3 2016 年 2 月 4 日
0.1.2 2016 年 1 月 31 日
0.1.1 2016 年 1 月 12 日
0.1.0 2016 年 1 月 12 日

#15#ssh-config

Download history 29/week @ 2024-03-02 59/week @ 2024-03-09 31/week @ 2024-03-16 25/week @ 2024-03-23 41/week @ 2024-03-30 20/week @ 2024-04-06 26/week @ 2024-04-13 24/week @ 2024-04-20 20/week @ 2024-04-27 24/week @ 2024-05-04 29/week @ 2024-05-11 26/week @ 2024-05-18 24/week @ 2024-05-25 29/week @ 2024-06-01 22/week @ 2024-06-08 16/week @ 2024-06-15

每月 93 次下载

MIT/Apache

655KB
598

包含 (ELF exe/lib, 625KB) 构建

绑定到 libssh。与 libssh2 (也提供了 rust 绑定,见 "ssh2" 包) 无关,

Libssh 是一个客户端和服务器库,支持 SSH 协议的 1 和 2 版本。客户端部分紧密遵循 openssh 的行为,特别是它解析 ~/.ssh/config,并自动接受 ProxyCommand 指令。

尽管此绑定是 Apache/MIT 许可的,但 libssl 本身是在 LGPL 许可下发布的。如果您计划静态链接(此包默认为动态链接),请确保您理解这意味着什么。

客户端示例

use ssh::*;

let mut session=Session::new().unwrap();
session.set_host("pijul.org").unwrap();
session.parse_config(None).unwrap();
session.connect().unwrap();
println!("{:?}",session.is_server_known());
session.userauth_publickey_auto(None).unwrap();

在远程服务器上运行命令

 use ssh::*;
 use std::io::Read;

 let mut session=Session::new().unwrap();
 session.set_host("pijul.org").unwrap();
 session.parse_config(None).unwrap();
 session.connect().unwrap();
 println!("{:?}",session.is_server_known());
 session.userauth_publickey_auto(None).unwrap();
 {
     let mut s=session.channel_new().unwrap();
     s.open_session().unwrap();
     s.request_exec(b"ls -l").unwrap();
     s.send_eof().unwrap();
     let mut buf=Vec::new();
     s.stdout().read_to_end(&mut buf).unwrap();
     println!("{:?}",std::str::from_utf8(&buf).unwrap());
 }

创建远程文件

 use ssh::*;
 use std::io::Write;

 let mut session=Session::new().unwrap();
 session.set_host("pijul.org").unwrap();
 session.parse_config(None).unwrap();
 session.connect().unwrap();
 println!("{:?}",session.is_server_known());
 session.userauth_publickey_auto(None).unwrap();
 {
     let mut scp=session.scp_new(WRITE,"/tmp").unwrap();
     scp.init().unwrap();
     let buf=b"blabla blibli\n".to_vec();
     scp.push_file("blublu",buf.len(),0o644).unwrap();
     scp.write(&buf).unwrap();
 }

创建包含文件的远程目录

 use ssh::*;
 use std::io::Write;

 let mut session=Session::new().unwrap();
 session.set_host("pijul.org").unwrap();
 session.parse_config(None).unwrap();
 session.connect().unwrap();
 println!("{:?}",session.is_server_known());
 session.userauth_publickey_auto(None).unwrap();
 {
     let mut scp=session.scp_new(RECURSIVE|WRITE,"/tmp").unwrap();
     scp.init().unwrap();
     scp.push_directory("testdir",0o755).unwrap();
     let buf=b"blabla\n".to_vec();
     scp.push_file("test file",buf.len(),0o644).unwrap();
     scp.write(&buf).unwrap();
 }

读取远程文件

 use ssh::*;
 use std::io::Read;

 let mut session=Session::new().unwrap();
 session.set_host("pijul.org").unwrap();
 session.parse_config(None).unwrap();
 session.connect().unwrap();
 println!("{:?}",session.is_server_known());
 session.userauth_publickey_auto(None).unwrap();
 {
     let mut scp=session.scp_new(READ,"/tmp/blublu").unwrap();
     scp.init().unwrap();
     loop {
         match scp.pull_request().unwrap() {
             Request::NEWFILE=>{
                 let mut buf:Vec<u8>=vec!();
                 scp.accept_request().unwrap();
                 scp.reader().read_to_end(&mut buf).unwrap();
                 println!("{:?}",std::str::from_utf8(&buf).unwrap());
                 break;
             },
             Request::WARNING=>{
                 scp.deny_request().unwrap();
                 break;
             },
             _=>scp.deny_request().unwrap()
         }
     }
 }

依赖关系