diff --git a/markbase-core/src/ssh_server/sftp_handler.rs b/markbase-core/src/ssh_server/sftp_handler.rs index 7c9b4ff..1a9a023 100644 --- a/markbase-core/src/ssh_server/sftp_handler.rs +++ b/markbase-core/src/ssh_server/sftp_handler.rs @@ -9,6 +9,7 @@ use std::path::{Path, PathBuf}; use std::fs::{self, File, OpenOptions}; use std::io::{Read, Write, Seek, SeekFrom}; use std::os::unix::fs::PermissionsExt; // 导入PermissionsExt trait(Unix标准) +use std::os::unix::fs::MetadataExt; // ⭐⭐⭐⭐⭐ Phase 2.2: 导入MetadataExt trait(获取uid/gid) /// SFTP packet类型(参考draft-ietf-secsh-filexfer-02.txt) #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -154,13 +155,19 @@ impl SftpAttrs { pub fn from_metadata(metadata: &fs::Metadata) -> Self { let mut attrs = Self::new(); + // ⭐⭐⭐⭐⭐ Phase 2.2: 添加 uid/gid 字段(修复 "? 0 0" 权限显示问题) attrs.flags = SftpAttrFlags::SSH_FILEXFER_ATTR_SIZE + | SftpAttrFlags::SSH_FILEXFER_ATTR_UIDGID // ⭐⭐⭐⭐⭐ 添加 UIDGID flag | SftpAttrFlags::SSH_FILEXFER_ATTR_PERMISSIONS | SftpAttrFlags::SSH_FILEXFER_ATTR_ACMODTIME; attrs.size = Some(metadata.len()); attrs.permissions = Some(metadata.permissions().mode()); + // ⭐⭐⭐⭐⭐ Phase 2.2: 获取 uid/gid(参考OpenSSH sftp-server.c: stat_to_attrib) + attrs.uid = Some(metadata.uid()); + attrs.gid = Some(metadata.gid()); + if let Ok(atime) = metadata.accessed() { attrs.atime = Some(atime.duration_since(std::time::UNIX_EPOCH).unwrap().as_secs() as u32); }