sftp保存失败主因是远程权限链断裂:缺w/x权限、属主错误、strictmodes拦截或preserve_modification_times在nfs/容器中触发静默失败;需逐级验证目录权限、属主及密钥配置。

Sublime Text 的 SFTP 插件写失败,90% 以上不是插件问题,而是远程路径权限链断裂——缺 w 权限、缺 x 权限、属主错、StrictModes 拦截,或 preserve_modification_times 在 NFS/容器中触发静默失败。
为什么改完保存没反应,也不报错?
这是 SFTP 最危险的“假成功”:插件日志显示 Upload completed,但远程文件内容完全没变。根本原因不是上传被拒,而是 SFTP 协议在写入过程中卡在某个中间步骤,比如:
- 远程目录不可写(
dr-xr-xr-x),导致无法创建临时文件或重命名 - 远程目录不可进入(缺
x权限),SFTP 无法cd进目标路径,后续所有操作失效 - SSH 因
~/.ssh/authorized_keys权限是644或属主不对,触发StrictModes on,降级为只读会话,插件不提示 - 服务器挂载的是 NFS 或容器卷,
preserve_modification_times设为true会导致时间戳同步失败,整个上传流程静默终止
检查远程权限必须跑这三行命令
别只看 ls -l,SFTP 写入依赖整条路径可写可进。登录服务器后,逐级验证:
ls -ld /var/www/html —— 确认输出含 drwxr-xr-x(至少有 wx)
touch /var/www/html/.test && rm /var/www/html/.test —— 成功说明当前用户有写+执行权;失败则可能是 SELinux/AppArmor 拦截,或父目录无 x
ls -ld /var/www —— 如果属主是 root:root,普通用户无法在其中创建子目录;应改为 sudo chown -R $USER:www-data /var/www/html(Ubuntu)或 sudo chown -R $USER:nginx /var/www/html(CentOS)
sftp-config.json 里三个权限相关字段怎么配
配置写对了,但权限行为仍异常,往往栽在这三个字段上:
-
"type": "sftp"必须明确写出,漏掉或误写成"ftp"会导致插件 fallback 到本地文件系统,看似保存成功,实则根本没传 -
"default_permissions": "644"是 Web 目录刚需。不设它,SFTP 默认用用户 umask(通常是 0022 → 644 文件 / 755 目录),但很多服务器 umask 是 0002,上传后变成 664,Nginx/Apache 拒绝读取 -
"preserve_modification_times": false在 NFS、Docker volume、某些云存储挂载路径下必须关掉。OpenSSH 对时间戳同步敏感,失败时不报错,只丢弃上传动作
密钥权限和 StrictModes 是隐藏杀手
你用命令行 sftp user@host 能连,不代表 Sublime 的 SFTP 插件能连——它每次调用都是全新 SSH 连接,不复用 ssh-agent,且对密钥权限更苛刻:
Linux/macOS 下,chmod 600 ~/.ssh/id_rsa 是硬性要求,644 或 640 都会被 OpenSSH 直接拒绝读取
服务器端 /etc/ssh/sshd_config 中 StrictModes yes(默认开启)会检查 ~/.ssh 和 ~/.ssh/authorized_keys 的权限和属主。只要 authorized_keys 是 644 或属主不是该用户,SSH 就降级为只读模式,SFTP 插件不提示,只静默失败
验证方式:ssh -o LogLevel=DEBUG3 user@host,看到 Authentication refused: bad ownership or modes for file 就是它











