SFTP连接失败主因是SSH服务未启用或22端口被防火墙拦截;uploadOnSave失效多因路径映射错误、ignore规则误配或remotePath非绝对路径;密钥登录失败常因私钥格式不符、权限不当或未正确指定privateKeyPath。

为什么 sftp.json 配置后连不上,报 connect ECONNREFUSED
多数情况不是密码或密钥错了,而是服务器根本没开 SSH 服务,或者防火墙拦了 22 端口。VSCode 的 SFTP 插件底层走的是 SSH 协议,它不自己起服务,只当客户端用。
- 先在本地终端执行
ssh user@host -p 22,能连上才说明基础通路没问题 -
host字段不能填域名别名(比如myserver),得是 IP 或可被 DNS 解析的完整域名 - 如果服务器改过 SSH 端口(比如改成 2222),
port字段必须显式写上,不能依赖默认值 - 部分云主机(如阿里云、腾讯云)安全组默认关闭所有端口,得手动放行对应
port
uploadOnSave 不生效,保存文件后远程没更新
这个开关只是“触发条件”,真正上传还取决于路径映射是否匹配、文件是否在 remotePath 覆盖范围内,以及有没有被 ignore 规则挡住。
- 确保
remotePath是绝对路径,比如/var/www/html/,不是相对路径或空字符串 -
uploadOnSave只对当前打开的、已保存的文件生效;新建未存盘的文件不会传 - 检查
ignore数组:像"*.log"、".env"这类规则会跳过匹配文件,哪怕手动右键上传也无效 - 如果项目有软链接,SFTP 插件默认不跟随,
followSymlinks得设为true才行
怎么让本地修改自动同步,又避免覆盖服务器上的配置文件
靠 ignore 和 watcher 组合控制粒度。SFTP 插件本身没有“双向同步”逻辑,所谓“自动同步”本质是单向上传 + 文件监听,所以必须主动排除敏感文件。
- 把
.env、config.php、wp-config.php这类带密码或环境信息的文件加进ignore - 启用
watcher时,files字段建议用 glob 模式,比如"**/*.php",避免监听整个目录导致 CPU 升高 - 如果服务器上某些文件是部署脚本生成的(比如
build/下的产物),本地不应编辑它们,就该把整目录加进ignore -
syncMode设成"update"(默认)比"full"更安全:只传变更文件,不删远程多出的文件
用密钥登录失败,提示 Permission denied (publickey)
VSCode SFTP 插件调用的是系统 OpenSSH,它不读取 Pageant 或其他密钥代理,只认标准的 OpenSSH 格式私钥,且权限必须严格。
- 私钥文件(如
id_rsa)权限必须是600(macOS/Linux),Windows 上也要右键属性 → 安全 → 只留当前用户读取 - 密钥不能是 PuTTY 格式(
.ppk),得用puttygen转成 OpenSSH 格式,或用ssh-keygen -p -f key.ppk(新版 OpenSSH 支持直接读) -
privateKeyPath填的是本地路径,比如"~/.ssh/id_rsa",波浪线会被正确展开;但"C:\Users\Me\.ssh\id_rsa"在 Windows 上要确认反斜杠没被转义 - 如果密钥有密码,插件会弹窗要你输——但仅第一次,之后会缓存;如果输错三次,得重启 VSCode 才能再试
remotePath 和 ignore 的配合关系:路径不对,上传就落空;忽略漏一条,可能就把数据库密码传上去了。真要动生产环境,先拿测试机跑一遍完整流程。











