11 个版本

0.2.3 2023 年 12 月 5 日
0.2.2 2023 年 7 月 31 日
0.2.0 2023 年 5 月 9 日
0.1.6 2023 年 3 月 3 日
0.1.0 2021 年 12 月 4 日

#1 in #ssh-config

Download history 393/week @ 2024-04-22 249/week @ 2024-04-29 214/week @ 2024-05-06 303/week @ 2024-05-13 266/week @ 2024-05-20 273/week @ 2024-05-27 390/week @ 2024-06-03 432/week @ 2024-06-10 319/week @ 2024-06-17 254/week @ 2024-06-24 346/week @ 2024-07-01 513/week @ 2024-07-08 345/week @ 2024-07-15 355/week @ 2024-07-22 217/week @ 2024-07-29 172/week @ 2024-08-05

1,117 个月下载量
8 包中使用 (7 直接)

MIT 许可

98KB
2K SLoC

ssh2-config

变更日志 · 入门 · 文档

@veeso 开发

当前版本:0.2.3 (05/12/2023)

License-MIT Repo stars Downloads counter Latest version Ko-fi

Build Coveralls Docs



关于 ssh2-config

ssh2-config 是一个库,提供了 SSH 配置文件的解析器,用于与 ssh2 包配合使用。

此库提供了一个解析配置文件的方法,并将解析后的配置返回为结构。`SshConfig` 结构提供了所有可以用来配置 ssh2 会话 以及解析主机、端口和用户名的属性。

一旦配置被解析,可以使用 query(&str) 方法根据配置的模式查询特定主机的配置。

尽管许多属性没有公开,因为不支持,但是仍然对配置进行了验证,因此无效的配置将导致解析错误。

公开的属性

  • BindAddress:您可以使用此属性将套接字绑定到特定地址
  • BindInterface:您可以使用此属性将套接字绑定到特定的网络接口
  • CASignatureAlgorithms:您可以使用此属性处理 CA 证书
  • CertificateFile:在必要时,您可以使用此属性解析证书文件
  • 加密方式:您可以使用此属性通过会话方法设置首选方法 session.method_pref(MethodType::CryptCs, ...)session.method_pref(MethodType::CryptSc, ...)
  • 压缩:您可以使用此属性通过 session.set_compress(value) 设置是否启用压缩
  • 连接尝试次数:您可以使用此属性循环连接以重试
  • 连接超时:您可以使用此属性设置套接字的连接超时
  • 主机名:您可以使用此属性获取要连接的主机的真实名称
  • 身份文件:您可以使用此属性设置连接远程主机时尝试的密钥
  • 密钥交换算法:您可以使用此属性通过 session.method_pref(MethodType::Kex, algos.join(",").as_str()) 配置密钥交换方法
  • MAC算法:您可以使用此属性通过 session.method_pref(MethodType::MacCs, algos.join(",").as_str())session.method_pref(MethodType::MacSc, algos.join(",").as_str()) 配置MAC算法
  • 端口号:您可以使用此属性解析要连接的端口号
  • 公钥认证:您可以使用此属性设置是否使用公钥认证
  • 远程转发:您可以使用此方法通过 session.channel_forward_listen() 实现端口转发
  • 服务器存活间隔:您可以使用此方法实现保持活动状态消息间隔
  • TcpKeepAlive:您可以使用此方法告诉是否发送保持活动状态消息
  • 使用密钥链:(仅限macos)用于告诉是否使用密钥链解密ssh密钥
  • 用户:您可以使用此方法解析用于登录的用户

缺少的功能


入门 🚀

首先,将ssh2-config添加到您的依赖项中

[dependencies]
ssh2-config = "^0.2"

然后解析配置

use ssh2_config::{ParseRule, SshConfig};
use std::fs::File;
use std::io::BufReader;

let mut reader = BufReader::new(File::open(config_path).expect("Could not open configuration file"));
let config = SshConfig::default().parse(&mut reader, ParseRule::STRICT).expect("Failed to parse configuration");

// Query attributes for a certain host
let params = config.query("192.168.1.2");

然后您可以使用解析后的参数来配置会话

use ssh2::Session;
use ssh2_config::{HostParams};

fn configure_session(session: &mut Session, params: &HostParams) {
    if let Some(compress) = params.compression {
        session.set_compress(compress);
    }
    if params.tcp_keep_alive.unwrap_or(false) && params.server_alive_interval.is_some() {
        let interval = params.server_alive_interval.unwrap().as_secs() as u32;
        session.set_keepalive(true, interval);
    }
    // algos
    if let Some(algos) = params.kex_algorithms.as_deref() {
        if let Err(err) = session.method_pref(MethodType::Kex, algos.join(",").as_str()) {
            panic!("Could not set KEX algorithms: {}", err);
        }
    }
    if let Some(algos) = params.host_key_algorithms.as_deref() {
        if let Err(err) = session.method_pref(MethodType::HostKey, algos.join(",").as_str()) {
            panic!("Could not set host key algorithms: {}", err);
        }
    }
    if let Some(algos) = params.ciphers.as_deref() {
        if let Err(err) = session.method_pref(MethodType::CryptCs, algos.join(",").as_str()) {
            panic!("Could not set crypt algorithms (client-server): {}", err);
        }
        if let Err(err) = session.method_pref(MethodType::CryptSc, algos.join(",").as_str()) {
            panic!("Could not set crypt algorithms (server-client): {}", err);
        }
    }
    if let Some(algos) = params.mac.as_deref() {
        if let Err(err) = session.method_pref(MethodType::MacCs, algos.join(",").as_str()) {
            panic!("Could not set MAC algorithms (client-server): {}", err);
        }
        if let Err(err) = session.method_pref(MethodType::MacSc, algos.join(",").as_str()) {
            panic!("Could not set MAC algorithms (server-client): {}", err);
        }
    }
}

fn auth_with_rsakey(
    session: &mut Session,
    params: &HostParams,
    username: &str,
    password: Option<&str>
) {
    for identity_file in params.identity_file.unwrap_or_default().iter() {
        if let Ok(_) = session.userauth_pubkey_file(username, None, identity_file, password) {
            break;
        } 
    }
}

示例

您可以在 client.rs 文件夹中查看 ssh2-config 与 ssh2 的实现示例。

您可以使用以下命令运行示例

cargo run --example client -- <remote-host> [config-file-path]

支持开发者 ☕

如果您喜欢 ssh2-config 并对我所做的工作表示感激,请考虑进行小额捐赠 🥳

您可以通过以下平台之一进行捐赠

ko-fi PayPal bitcoin


贡献和问题 🤝🏻

欢迎贡献、错误报告、新功能和提问!😉 如果您有任何疑问或担忧,或想要建议新功能,或者只是想改进 ssh2-config,请随时提交问题或拉取请求。

请遵循我们的贡献指南


变更日志 ⏳

在此查看 ssh2-config 的变更日志


许可 📃

ssh2-config 使用 MIT 许可证授权。

您可以在此处阅读整个许可证

依赖关系

~0.4–10MB
~63K SLoC