当前位置:论坛首页 > BUG提交 > Linux面板

【BUG】FTP存储空间插件使用SFTP时,含中文的备份路径会在...

发表在 BUG提交前天 05:52 [复制链接] 1 29


■ 环境
宝塔面板:11.8.1
FTP存储空间插件:6.0
系统:Ubuntu 24.04.3 LTS
面板 Python:3.7.16 (pyenv),paramiko 2.7.1
远端:fnOS(Debian 12),OpenSSH 9.2p1 的 SFTP 子系统

■ 复现步骤
1. 计划任务 → 备份到 → 添加存储空间 → FTP存储空间
2. 打开「使用SFTP」,Host 填 域名:端口,填用户名密码
3. 存储位置填一个含中文的绝对路径,例如:
   /vol1/1000/服务器备份/国内宝塔备份/
4. 保存后新建「备份网站」任务,备份到该存储空间
5. 任务日志显示:
   |-正在上传文件到 /vol1/1000/æ\x9c\x8då\x8a¡å\x99¨å¤\x87份/...
   最终提示任务成功

■ 预期结果
远端在 /vol1/1000/服务器备份/国内宝塔备份/site/<站点名>/
下生成 web_<站点名>_<时间>.tar.gz

■ 实际结果
远端新建了一整棵乱码目录树:
/vol1/1000/æ\x9c\x8då\x8a¡å\x99¨å¤\x87ä½/
  å\x9b½å\x86\x85å®\x9då¡\x94å¤\x87ä½/site/<站点名>/web_*.tar.gz
而用户指定的中文目录 /vol1/1000/服务器备份/国内宝塔备份/ 始终为空。

■ 根因
文件:/www/server/panel/plugin/ftp/ftp_main.py
函数:build_object_name()(第 307 行),末尾第 333 行:

    return object_name.encode('utf-8').decode('latin1')

这行是为了绕过 ftplib 默认 latin-1 编码的经典 hack:把 UTF-8 字节
伪装成 latin-1 字符,ftplib 再用 latin-1 编码回去时恰好还原成 UTF-8
字节串。对 FTP/FTPS 是正确的。

问题在于 BTSFTPClient 继承的是同一个 build_object_name(),而 SFTP
走的是 paramiko —— paramiko 对 str 参数原生按 UTF-8 编码,这串"伪装
成 latin-1 的字符"于是被二次 UTF-8 编码,落盘就是乱码。

■ 字节级验证(在远端 NAS 上 os.fsencode() 读到的真实文件名)
原始字节:b'\xc3\xa6\xc2\x9c\xc2\x8d\xc3\xa5\xc2\x8a\xc2\xa1...'
按 UTF-8 解码:æ\x9c\x8då\x8a¡å\x99¨å¤\x87ä½
按 latin-1 还原:服务器备份
典型的 UTF-8 → latin-1 → UTF-8 双重编码特征。

■ 影响范围(不止中文)
存储位置填              实际落盘
/backup/服务器备份/     /backup/æ\x9c\x8då\x8a¡å\x99¨å¤\x87ä½/
/backup/バックアップ/   /backup/ã\x83\x90ã\x83\x83ã\x82¯ã\x82¢ã\x83\x83ã\x83\x97/
/backup/备份
使用道具 举报 只看该作者 回复
发表于 前天 09:29 | 显示全部楼层
您好,非常感谢反馈和支持!您的建议已收到并记录,后续会联系相关人员进行技术评估
如果您还有更多问题和疑虑,您可以通过客服咨询宝塔面板相关问题:https://docs.bt.cn/wechat-service
操作方式:复制链接在微信打开,即可在线咨询客服。
为提高沟通效率,建议您在微信咨询前先填写以下信息,将信息一并发送给客服,以便客服快速定位您的问题:
问题描述(请尽量详细):
论坛帖子地址:
操作系统:
面板版本:
感谢您的支持!
使用道具 举报 回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

紧急运维服务

响应时间:3分钟

问题处理方式:宝塔专家1对1服务

工作时间:工作日:9:00 - 18:30

宝塔专业团队为您解决服务器疑难问题

点击联系技术分析

工作时间:09:00至18:30

快速回复 返回顶部 返回列表