use anyhow::Result; use russh::server::{Server, Config}; use russh::*; use russh_sftp::server::SftpServer; use std::sync::Arc; use tokio::net::TcpListener; use log::{info, error}; use crate::auth::MockAuthDb; use crate::shell_handler::ShellSession; // MarkBase SSH服务器 pub struct MarkBaseSshServer { auth_db: Arc, config: Arc, } impl MarkBaseSshServer { pub fn new(auth_db: Arc) -> Self { // 创建服务器配置 let config = Config { // 简化配置,实际使用时需要生成host key keys: vec![], ..Default::default() }; Self { auth_db, config: Arc::new(config), } } pub async fn run_server() -> Result<()> { info!("Creating SSH server..."); // 1. 创建认证数据库 let auth_db = Arc::new(MockAuthDb::new()); // 2. 创建服务器实例 let server = MarkBaseSshServer::new(auth_db); // 3. 监听2022端口(避免与SFTPGo冲突) let listener = TcpListener::bind("0.0.0.0:2022").await?; info!("SSH server listening on port 2022"); // 4. 接受连接 loop { let (socket, addr) = listener.accept().await?; info!("New connection from {}", addr); // 5. 处理连接(spawn异步任务) tokio::spawn(async move { if let Err(e) = server.handle_connection(socket).await { error!("Connection error: {}", e); } }); } } async fn handle_connection(&self, socket: tokio::net::TcpStream) -> Result<()> { // SSH握手和处理 // 实际实现需要调用russh server API // POC阶段简化,Phase 2完整实现 info!("Connection handled (POC simplified)"); Ok(()) } } // russh Server trait实现 impl Server for MarkBaseSshServer { type Handler = ShellSession; fn new_client(&mut self, _peer_addr: Option) -> Self::Handler { // 创建客户端handler(shell + SFTP支持) ShellSession::new(self.auth_db.clone(), "unknown".to_string()) } }