From b4a00d80d3f8722f1260c1c813245c020b407038 Mon Sep 17 00:00:00 2001 From: Baobhan Sith <80159437+Heavrnl@users.noreply.github.com> Date: Wed, 14 May 2025 11:50:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=86=99=E5=85=A5=E5=90=8E=E6=9D=83=E9=99=90=E5=92=8C=E5=8E=9F?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8D=E5=8C=B9=E9=85=8D=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/backend/src/services/sftp.service.ts | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/services/sftp.service.ts b/packages/backend/src/services/sftp.service.ts index 40f3d67..3320d12 100644 --- a/packages/backend/src/services/sftp.service.ts +++ b/packages/backend/src/services/sftp.service.ts @@ -371,8 +371,29 @@ export class SftpService { return; } + // 获取文件当前权限 + let originalMode: number | undefined; + try { + const stats = await new Promise((resolve, reject) => { + state.sftp!.lstat(path, (err, stats) => { + if (err) { + reject(err); + } else { + resolve(stats); + } + }); + }); + originalMode = stats.mode; + console.log(`[SFTP ${sessionId}] Retrieved original file mode for ${path}: ${originalMode.toString(8)} (ID: ${requestId})`); + } catch (statError: any) { + console.warn(`[SFTP ${sessionId}] Could not retrieve original file mode for ${path} (ID: ${requestId}):`, statError); + // 如果文件不存在或其他错误,继续写入操作,不设置权限 + } + console.debug(`[SFTP ${sessionId}] Creating write stream for ${path} (ID: ${requestId})`); - const writeStream = state.sftp.createWriteStream(path); + // 在创建写入流时设置文件权限 + const writeStreamOptions = originalMode !== undefined ? { mode: originalMode } : {}; + const writeStream = state.sftp.createWriteStream(path, writeStreamOptions); let errorOccurred = false; writeStream.on('error', (err: Error) => { @@ -386,16 +407,18 @@ export class SftpService { writeStream.on('close', () => { if (!errorOccurred) { console.log(`[SFTP ${sessionId}] writefile ${path} stream closed successfully (ID: ${requestId}). Fetching updated stats...`); + if (originalMode !== undefined) { + console.log(`[SFTP ${sessionId}] Set file mode for ${path} during creation: ${originalMode.toString(8)} (ID: ${requestId})`); + } // Get updated stats after writing state.sftp!.lstat(path, (statErr, stats) => { if (statErr) { console.error(`[SFTP ${sessionId}] lstat after writefile ${path} failed (ID: ${requestId}):`, statErr); - // Send success anyway, but without updated item details state.ws.send(JSON.stringify({ type: 'sftp:writefile:success', path: path, payload: null, requestId: requestId })); } else { const updatedItem = { filename: path.substring(path.lastIndexOf('/') + 1), - longname: '', // lstat doesn't provide longname + longname: '', attrs: { size: stats.size, uid: stats.uid, gid: stats.gid, mode: stats.mode, atime: stats.atime * 1000, mtime: stats.mtime * 1000,