应使用持续更新的 sftp 插件(liximomo 开发)替代已停更的 ftp-simple;它基于 SSH 更安全,需正确配置 sftp.json 的 host、port、username、remotePath 四字段,注意路径格式、编码及权限设置。

用 SFTP 插件替代 FTP(别再碰 ftp-simple)
VS Code 原生不支持 FTP/SFTP,必须靠插件;但 ftp-simple 已停止维护,连接不稳定、中文路径乱码、断连不重试,尤其在 macOS 或 Windows WSL 下常报 ENOTFOUND 或 ECONNREFUSED。现在主流且持续更新的是 sftp 插件(作者: liximomo),它基于 SSH 协议,更安全,也兼容绝大多数 Linux 服务器的 OpenSSH 配置。
安装后,按 Cmd+Shift+P(macOS)或 Ctrl+Shift+P(Windows/Linux),输入 SFTP: Config 生成 sftp.json 配置文件——这是唯一需要手动编辑的地方,其余操作全图形化。
sftp.json 中必填的 4 个字段
配置错一个字段,SFTP: Upload File 就会静默失败,或者上传到错误目录。重点不是“填什么”,而是“为什么必须这样填”:
-
host:填服务器 IP 或域名,不能带sftp://前缀;如果用了跳板机,得配proxy字段,不是改host -
port:默认是22,除非你明确改过 SSH 端口;填21是无效的(那是 FTP 端口,sftp插件根本不走 FTP 协议) -
username和password:密码只在首次连接时用;后续建议换成privateKeyPath(比如"~/.ssh/id_rsa"),避免明文存密码;注意路径要用正斜杠,Windows 上写C:/Users/name/.ssh/id_rsa,别用反斜杠 -
remotePath:必须以/开头,比如"/var/www/html";写成"var/www/html"会传到用户 home 目录下,而不是网站根目录
自动上传 vs 手动上传:触发时机和范围差异
sftp 插件默认不监听文件保存事件,所谓“自动上传”其实是靠 watcher 机制模拟的,有明显延迟(通常 1–3 秒),且不保证顺序。真要可靠,优先用手动操作:
- 右键单个文件 →
SFTP: Upload File:只传当前文件,路径按remotePath+ 当前工作区相对路径拼接 - 右键文件夹 →
SFTP: Upload Folder:整个文件夹结构原样同步,但不会删除远程多余文件(不是 rsync) - 启用
uploadOnSave:在sftp.json里加"uploadOnSave": true,但它只对已打开并保存过的文件生效;新建文件、未显式保存的编辑内容,不会触发 - 别依赖
fileWatcher做构建部署:它无法识别.gitignore或构建产物(如dist/),容易把 node_modules 也扫进去
中文文件名乱码、权限 600 错误、超时中断
这些问题几乎都出在服务端 SSH 配置或客户端编码假设不一致:
- 中文文件名显示为
%E4%BD%A0%E5%A5%BD或一堆问号:服务器的 locale 没设好,检查locale命令输出是否含UTF-8;临时解决可在sftp.json加"encoding": "utf8"(注意不是"utf-8") - 上传后文件权限变成
600,网页打不开:SFTP 默认用用户 umask 创建文件,不是继承目录权限;加配置"fileMode": "644"和"directoryMode": "755" - 大文件(>10MB)上传中途断开,报
read ECONNRESET:不是网络问题,是服务器sshd_config缺少ClientAliveInterval 60和TCPKeepAlive yes;本地插件侧可调"concurrency": 1降低并发压力
最麻烦的其实是路径映射——比如你在 VS Code 里打开的是 /Users/name/project,但想把 src/ 下的内容传到服务器 /var/www/app/src,这时 remotePath 必须设成 "/var/www/app",再配合 "workspaceFolder": "project",否则插件会从整个磁盘根开始算路径。


















