#ssh-agent #ssh #agent #openssh #async #unix-socket

ssh-agent-lib

用于编写自定义SSH代理的类型集合

6个版本

0.4.0 2024年3月25日
0.3.0 2024年2月27日
0.2.7 2024年2月16日
0.2.5 2022年5月10日
0.2.3 2022年3月28日

#69 in 认证


2 crates 中使用

MIT 许可证

56KB
1.5K SLoC

ssh-agent-lib

CI Crates.io

根据SSH代理协议Internet Draft编写的用于编写自定义SSH代理的类型集合。

这使得可以使用默认OpenSSH代理不支持远程密钥。

示例

以下示例在一个套接字上开始监听并处理请求。在Unix上使用ssh-agent.sock Unix域套接字,而在Windows上使用命名管道\\.\pipe\agent

#[cfg(not(windows))]
use tokio::net::UnixListener;
#[cfg(windows)]
use ssh_agent_lib::agent::NamedPipeListener;

use ssh_agent_lib::agent::{Session, Agent};
use ssh_agent_lib::proto::message::Message;

#[derive(Default)]
struct MyAgent;

#[ssh_agent_lib::async_trait]
impl Session for MyAgent {
    async fn handle(&mut self, message: Message) -> Result<Message, Box<dyn std::error::Error>> {
        match message {
            Message::SignRequest(request) => {
                // get the signature by signing `request.data`
                let signature = vec![];
                Ok(Message::SignResponse(signature))
            },
            _ => Ok(Message::Failure),
        }
    }
}

#[tokio::main]
#[cfg(not(windows))]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let socket = "ssh-agent.sock";
    let _ = std::fs::remove_file(socket); // remove the socket if exists

    MyAgent.listen(UnixListener::bind(socket)?).await?;
    Ok(())
}

#[tokio::main]
#[cfg(windows)]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    MyAgent.listen(NamedPipeListener::new(r"\\.\pipe\agent".into())?).await?;
    Ok(())
}

现在,使用SSH_AUTH_SOCK环境变量将您的OpenSSH客户端指向此套接字,它将透明地使用代理

SSH_AUTH_SOCK=ssh-agent.sock ssh [email protected]

在Windows上必须使用管道的路径

SSH_AUTH_SOCK=\\.\pipe\agent ssh [email protected]

更多详细的示例请参阅examples目录或使用ssh-agent-lib的crates。

注意

此库是从sekey/ssh-agent.rs分叉的,因为上游似乎没有得到维护(至少截至2022年)。

许可证

本项目采用MIT许可证

贡献

除非您明确说明,否则您提交的任何有意包含在此crate中的贡献都将按上述方式许可,无需任何附加条款或条件。

依赖关系

~0.5–9.5MB
~85K SLoC