1. 为什么我还在用 Remote VSCode 做远端文件同步
如果你手头有一台云服务器、实验室机器或者公司跳板机,本地写代码、远端跑训练或服务,那“文件怎么同步”这件事一定绕不开。最直接的办法是本地写完用 scp 传,或者干脆双端 git 提交拉取,但改一行传一次、提交一次,来回切终端,效率低得让人抓狂。VSCode 的 Remote VSCode 插件就是为这个场景准备的:它让你在本地 VSCode 里直接打开远端文件,编辑保存后自动写回远端,省掉手动上传下载。
Remote VSCode 的工作方式其实很朴素,它基于 rmate 协议。本地 VSCode 启动一个监听服务,远端通过 SSH 反向端口转发把文件内容送到本地,你在本地编辑,保存时再通过同一条通道写回远端。所以它本质上是“远端文件在本地编辑”,而不是把整个远端目录挂载到本地。适合谁?适合只需要改几个脚本、调几个配置文件、看日志顺手改代码的人。如果你要管理整个工程目录、跑调试器、用终端,那还是 Remote-SSH 更合适。但 Remote VSCode 胜在轻量,配置一次,之后一条rmate命令就能把远端文件拉到本地编辑器里。
我试过在训练机上改 dataloader,本地 VSCode 开着,远端rmate train.py,改完 Ctrl+S,状态栏闪一下 “Save xxx to ubuntu@xxx”,远端文件就更新了。整个过程不用离开编辑器,也不用记 scp 路径。下面把 settings.json 配置、SSH 参数、启动同步和验证动作完整走一遍。
2. 前置准备:TaoToken 与本地环境
在讲配置之前,先把两件事说清楚。第一是本地环境:VSCode 需要安装 Remote VSCode 插件,远端需要安装 rmate,SSH 要能正常连上。第二是如果你在远端跑的是大模型相关任务,需要调用模型 API 做推理或 Agent 编排,可以用 TaoToken 做统一接入。它的 API 地址是https://taotoken.net/api,兼容 OpenAI 风格的调用方式,本地和远端都能直接请求,不用在每台机器上分别配不同厂商的 Key。
TaoToken 在这里的角色是“模型能力的统一入口”。你远端训练脚本里如果要加一段推理验证、或者本地写 Agent 代码要调模型,都可以走同一个 API。注册和拿 Key 在官网https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=完成,登录后在控制台创建 API Key。控制台地址是https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite,API Keys 管理页在https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite。拿到 Key 之后,本地和远端的环境变量里都设同一个值就行。
这一步不是 Remote VSCode 同步的必要条件,但如果你远端脚本里要调模型,提前把 Key 配好,后面改代码时就不用再切出去折腾认证。模型对话调试可以用https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite,长期编码和 Agent 任务可以看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite。
3. 可复制配置:settings.json 与 SSH config
3.1 安装插件与确认默认端口
在 VSCode 扩展面板搜索 “Remote VSCode”,作者是 rafaelmaiolla,安装后重启。打开设置(Ctrl+,),搜索remote,能看到remote.port默认是52698,remote.host默认127.0.0.1。这两个值要和后面 SSH 反向转发、rmate 的-p参数保持一致。我一般不改,直接用 52698。
3.2 settings.json 骨架
按 Ctrl+Shift+P,输入 “Open Settings (JSON)”,在用户设置里加入下面这段。如果你只想对某个工作区生效,就放到.vscode/settings.json。
{ "remote.port": 52698, "remote.host": "127.0.0.1", "remote.onstartup": true, "remote.autoForwardPorts": false, "remote.showStatusAlerts": true }remote.onstartup设为 true 后,VSCode 启动时自动开启监听服务,省得每次按 F1 手动 start server。remote.showStatusAlerts打开后,保存成功会在状态栏提示,方便确认同步是否真的写回远端。remote.autoForwardPorts关掉,避免和手动 SSH 转发冲突。
3.3 SSH config 配置反向转发
本地终端执行vim ~/.ssh/config,加入:
Host dl_aws HostName 18.212.101.21 User ubuntu ForwardAgent yes RemoteForward 52698 127.0.0.1:52698 IdentityFile /home/ubuntu/Desktop/dl_aws_new.pemRemoteForward 52698 127.0.0.1:52698是关键:远端 52698 端口的流量转发到本地 127.0.0.1:52698,也就是 VSCode 的监听端口。这样远端执行 rmate 时,数据能回到本地编辑器。HostName、User、IdentityFile换成你自己的。配好后ssh dl_aws能直接登录,不用再写一长串-i和用户名。
3.4 远端安装 rmate
本地和远端都要装 rmate。远端执行:
sudo wget -O /usr/local/bin/rmate https://raw.githubusercontent.com/aurora/rmate/master/rmate sudo chmod a+x /usr/local/bin/rmate如果远端网络拉取 GitHub 慢,可以先在本地下载再 scp 过去,或者用包管理器装。装完which rmate确认路径。建议在远端~/.bashrc里加个别名:
alias rcode="rmate -p 52698"这样以后直接rcode /path/to/file就行。
4. 启动同步与验证请求
4.1 启动本地监听服务
VSCode 里按 F1,输入remote,选择 “Remote: Start Server”。状态栏左下角会出现 “Remote server started on port 52698” 之类的提示。如果你在 settings.json 里开了remote.onstartup,这一步会自动完成。确认服务起来后,再开 SSH 连接。
4.2 建立 SSH 连接并触发远端打开
本地终端ssh dl_aws登录远端。在远端执行:
rmate -p 52698 /home/ubuntu/train.py如果配了别名就是rcode /home/ubuntu/train.py。执行后本地 VSCode 会自动打开这个文件,标签页标题通常是临时路径。此时文件内容来自远端,但编辑发生在本地。
4.3 修改并确认写回
在本地 VSCode 里改一行,比如把batch_size = 32改成batch_size = 64,Ctrl+S 保存。状态栏会短暂显示 “Save /home/ubuntu/train.py to ubuntu@18.212.101.21”,消失后说明写回完成。回到远端终端执行:
grep batch_size /home/ubuntu/train.py看到batch_size = 64就说明同步链路通了。再试一次反向验证:远端用sed -i 's/64/128/' /home/ubuntu/train.py改掉,本地 VSCode 里文件不会自动刷新,需要重新rmate打开才能看到新内容。这一点要清楚:Remote VSCode 是“打开时拉取、保存时写回”,不是双向实时监听。
4.4 多文件与临时目录说明
远端文件在本地是以临时文件形式打开的,通常在/tmp下,所以不会覆盖你本地同名文件。可以同时rmate多个文件,VSCode 会开多个标签页。但如果你关掉了某个远端文件的标签页,想再编辑必须回远端重新执行rmate,它不会保留在最近打开列表里。这是这个插件最不方便的地方,习惯就好。
5. 本篇常见错排查
5.1 rmate 执行后本地没反应
先确认本地 VSCode 的 Remote Server 是否启动。F1 输入 remote,看有没有 “Stop Server” 选项,有才说明在运行。再确认 SSH 连接时RemoteForward是否生效,可以在远端执行ss -tlnp | grep 52698,看 52698 是否在监听。如果没有,说明 SSH config 没写对或者连接时没走这个 Host。
5.2 保存时报连接失败
多半是本地监听端口和 rmate 的-p不一致。检查 settings.json 的remote.port、SSH config 的RemoteForward第一个端口、rmate 命令的-p参数,三处必须相同。另外确认本地防火墙没拦 127.0.0.1:52698。
5.3 远端 rmate 命令找不到
rmate: command not found说明没装或者不在 PATH。用绝对路径/usr/local/bin/rmate试一下。如果远端是普通用户没有 sudo 权限,可以装到~/.local/bin/rmate,然后把该目录加入 PATH。
5.4 保存后远端文件没变
看状态栏提示是否出现又消失。如果提示一闪而过但远端没变,可能是文件权限问题,远端文件属主和登录用户不一致。用ls -l确认,必要时chown改属主。还有一种情况是打开了软链接文件,rmate 写回的是链接指向的真实路径,去真实路径确认。
5.5 多个 SSH 会话端口冲突
如果你同时开多个 SSH 连接都配了RemoteForward 52698,第二个连接会报端口占用。解决办法是每个会话用不同远端端口,比如RemoteForward 52699 127.0.0.1:52698,然后 rmate 用-p 52699。但本地 VSCode 只有一个监听端口,所以同一时间只能服务一个转发通道,多会话场景建议只保留一个。
6. 接入与调试入口
Remote VSCode 的同步链路跑通后,远端脚本里如果要加模型调用,直接在代码里请求 TaoToken 的 API 就行。本地和远端用同一个 Key,环境变量设TAOTOKEN_API_KEY,请求地址https://taotoken.net/api。调试模型返回是否正常,可以用模型对话页面发一条测试消息:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite。如果你在写长期运行的编码 Agent,需要看额度和调用方式,Coding Plan 页面有说明:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite。接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,API Key 在https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite管理。Claude Code 相关配置参考https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude-code-anthropic&utm_campaign=rewrite。
最后说一个我踩过的坑:VSCode 里如果已经打开了本地工程的其他文件,再 rmate 远端文件,标签页混在一起容易改错。建议同步远端文件时单独开一个 VSCode 窗口,或者至少确认当前标签页标题是临时路径再动手。保存后养成看一眼状态栏提示的习惯,提示消失再切走,避免写回没完成就关掉。