diff --git a/markbase-core/src/ssh_server/channel.rs b/markbase-core/src/ssh_server/channel.rs index 58a74a1..00f89d0 100644 --- a/markbase-core/src/ssh_server/channel.rs +++ b/markbase-core/src/ssh_server/channel.rs @@ -9,7 +9,9 @@ use log::{info, warn, debug}; use std::collections::HashMap; use std::sync::{Arc, Mutex}; use crate::ssh_server::sftp_handler::SftpHandler; // Phase 7: SFTP handler -use std::path::PathBuf; // Phase 7: Path for SFTP root directory +use crate::ssh_server::scp_handler::ScpHandler; // Phase 8: SCP handler +use crate::ssh_server::rsync_handler::RsyncHandler; // Phase 8: rsync handler +use std::path::PathBuf; // Phase 7-8: Path for SFTP/SCP/rsync root directory /// SSH Channel管理器(参考OpenSSH channel.c: struct channel) pub struct ChannelManager { @@ -76,6 +78,8 @@ impl ChannelManager { state: ChannelState::Open, output_buffer: None, // Phase 6: 初始化为空 sftp_handler: None, // Phase 7: 初始化为空 + scp_handler: None, // Phase 8: 初始化为空 + rsync_handler: None, // Phase 8: 初始化为空 }; self.channels.insert(server_channel, channel); @@ -140,18 +144,45 @@ impl ChannelManager { info!("Exec command: {}", command); - // 执行命令(Phase 6实现基础命令执行) - let output = self.execute_command(&command)?; - - // 存储输出,等待后续发送CHANNEL_DATA - if let Some(ch) = self.channels.get_mut(&channel) { - ch.output_buffer = Some(output); - } - - if want_reply { - Ok(Some(self.build_channel_success(channel)?)) + // Phase 8: 检测SCP/rsync命令 + if command.starts_with("scp ") { + info!("SCP command detected: {}", command); + let scp_handler = ScpHandler::parse_scp_command(&command)?; + if let Some(ch) = self.channels.get_mut(&channel) { + ch.scp_handler = Some(scp_handler); + info!("SCP handler initialized for channel {}", channel); + } + if want_reply { + Ok(Some(self.build_channel_success(channel)?)) + } else { + Ok(None) + } + } else if command.starts_with("rsync ") { + info!("rsync command detected: {}", command); + let rsync_handler = RsyncHandler::parse_rsync_command(&command)?; + if let Some(ch) = self.channels.get_mut(&channel) { + ch.rsync_handler = Some(rsync_handler); + info!("rsync handler initialized for channel {}", channel); + } + if want_reply { + Ok(Some(self.build_channel_success(channel)?)) + } else { + Ok(None) + } } else { - Ok(None) + // 普通命令执行(Phase 6) + let output = self.execute_command(&command)?; + + // 存储输出,等待后续发送CHANNEL_DATA + if let Some(ch) = self.channels.get_mut(&channel) { + ch.output_buffer = Some(output); + } + + if want_reply { + Ok(Some(self.build_channel_success(channel)?)) + } else { + Ok(None) + } } } @@ -497,6 +528,8 @@ struct Channel { state: ChannelState, output_buffer: Option>, // Phase 6: 命令输出缓冲 sftp_handler: Option, // Phase 7: SFTP处理器 + scp_handler: Option, // Phase 8: SCP处理器 + rsync_handler: Option, // Phase 8: rsync处理器 } /// SSH Channel状态(参考OpenSSH channel.c)