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
1,117 个月下载量
在 8 个 包中使用 (7 直接)
98KB
2K SLoC
ssh2-config
由 @veeso 开发
当前版本:0.2.3 (05/12/2023)
关于 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 并对我所做的工作表示感激,请考虑进行小额捐赠 🥳
您可以通过以下平台之一进行捐赠
贡献和问题 🤝🏻
欢迎贡献、错误报告、新功能和提问!😉 如果您有任何疑问或担忧,或想要建议新功能,或者只是想改进 ssh2-config,请随时提交问题或拉取请求。
请遵循我们的贡献指南
变更日志 ⏳
在此处查看 ssh2-config 的变更日志
许可 📃
ssh2-config 使用 MIT 许可证授权。
您可以在此处阅读整个许可证
依赖关系
~0.4–10MB
~63K SLoC