1. 环境
- 1.52.1 (user setup)
- Win10
- 远程 linux 服务器
2. 安装 VSCode
推荐下载 64bit User Installer,当然其它也可以。
3. 安装 VSCode 插件 Remote - SSH
这个插件是连接远程服务器开发的核心插件,必须有。
4. 生成秘钥并配置
4.1. 生成秘钥
Win 图标 > 右单机 > Windows PowerShell (管理员)(A) > 输入:ssh-keygen.exe -t rsa > 一路狂按 Enter > 复制生成的 id_rsa 路径到记事本备用(路劲格式为:C:\Users\xxxx/.ssh/id_rsa,对你没看错,既有正斜杠又有反斜杠,不要怀疑) > 记事本打开生成的 id_rsa.pub 文件等待后续使用。
笔者这里已经生成过 id_rsa 了,所以显示的信息不一样。如果你以前生成过 id_rsa 了,那么就不用再次生成了。这个 id_rsa 在本机 VSCode 连接远程服务器时认证使用。
4.2. 配置 VSCode 和远程服务器的认证秘钥
1、安装完 Remote - SSH 后,VSCode 左侧栏会有 "远程资源管理器" 图标,如果没有就右单机打开。
2、打开 Remote -SSH 配置文件:
配置完毕之后,"远程资源管理器" 中会显示你已经配置的服务器:
3、打开远程 Linux 服务器添加认证秘钥:
把刚才打开的 id_rea.pub 里边的内容追加到 authorized_keys 里边:
5. 在 VSCode 中打开远程服务器
在 "远程资源管理器" 选择一个服务器进行连接:
- 初次连接会提示你选择远程服务器平台,这里我们例子中的服务器都是 Linux,选 Linux 就 OK。
- 初次连接可能会有一些其它提示框,看着选就可以了。
- 初次连接会在远程 Linux 服务器上下载 vscode server,本机的 VSCode 和远程 Linux 服务器正是通过 vscode server 进行交互的,所以这个 vscode server 是必须有的。但是对公司环境来说,vscode server 可能会自动下载安装失败,此时就需要手动在服务器端安装 vscode server,离线安装教程参看:《离线安装VSCode Server》。
- 安装好的 vscoder server 在远程 Linux 服务器的 ~/.vscode-server 目录下。
- 如果换了环境,又懒得重新安装 vscode server 和插件,那么我们只需打包 .vscode-server 文件,然后拷贝到另一台服务器解压到用户根目录下就 OK 了。
- 需要一个特别注意的问题:服务器的 vscode server 和本机的 VSCode 版本需要对应,若本机的 VSCode 更新了,那么你就连不上了,需要更新服务器的 vscode server。
正确连接之后,VSCode 左下角会显示服务器信息:
6. 搭建开发环境
上述只是让你连接到了远程服务器进行开发,而在服务上编写 C++ 代码还需要在服务器上搭建一套 C++ 开发环境,这样才能自动补全,语法分析。编写 Python,Rust,Shell 类似。
环境搭建教程参看:
上述方法是在本地 WSL Linux/Win10 上搭建环境,但同样适用于服务器 Linux。只不过需要把对应的插件安装在服务器上(因为我们的代码是在服务器上,因此用于分析的插件当然也要运行在服务器上,本机 VSCode 通过 ssh 协议获取数据仅做界面展示)。但公司的办公环境,服务器一般是没有网络的,就无法在线安装插件,怎么办?
1、从插件官网下载 .visx 格式的插件安装包(不再介绍方法,网上搜索),然后上传到服务器上,再通过 VSCode 安装。
2、在本机安装好插件,然后把插件打包上传到服务器对应目录。本机目录:~/.vscode/extensions/,服务器目录:~/.vscode-server/extensions/。但是注意,本机打包的时候要排除两个文件:extensions.json
和 .init-default-profile-extensions
。
这里直接给一个脚本,用于打包本地 Linux 的扩展包,然后自动上传到远端 Linux 服务器上,根据实际情况修改你服务器的 IP:
#!/bin/bash
# 版本:0.1.0
# 描述:打包本机VSCode扩展,上传到服务器个人目录下,更新服务器上的VSCode扩展。
set -x
# 打包本机扩展
cd ~/.vscode
rm -rf extensions.tar.gz
tar czf extensions.tar.gz --exclude="extensions.json" --exclude=".init-default-profile-extensions" --exclude=".obsolete" extensions
# 修改user_ip_list配置要上传的服务器列表
user_ip_list=("zhangdongyu@10.xx.xx.230" "zhangdongyu@10.xx.xx.136")
for ((i = 0; i < ${#user_ip_list[@]}; i++)); do
# 上传到远端并解压
ssh ${user_ip_list[i]} "rm -rf ~/.vscode-server/extensions.tar.gz"
scp ~/.vscode/extensions.tar.gz ${user_ip_list[i]}:~/.vscode-server
ssh ${user_ip_list[i]} "cd ~/.vscode-server; rm -rf extensions; tar xf extensions.tar.gz; rm -rf extensions.tar.gz"
done
# 删除本机的extensions.tar.gz
rm -rf extensions.tar.gz
8. 远程开发常见问题汇总
8.1. Win 下 VSCode Remote SSH 远程开发频繁掉线
问题原因:
Win 自带的 ssh
软件和 VSCode 不兼容会导致频繁掉线,卡顿,重连。
解决方案:
更新 Win 的 ssh
软件。可下载 git
软件并安装,git
中带有 ssh.exe
,用这个就行了。
操作步骤:
1、官网下载 git
的 Windows 版本;
2、用默认配置安装;
3、在 git
安装目录中找到 ssh.exe
路径,默认路径是:C:\Program Files\Git\usr\bin\ssh.exe
;
4、打开 VSCode > 打开 Remote SSH 插件设置 > 找到 Remote.SSH.Path
配置项 > 在里边填写 ssh.exe
的完整路径;
5、重新用 VSCode 连接远程服务器开发,就不会再掉线了。
8.2. Remote-SSH 连接服务器出错
● Failed to set up socket for dynamic port forward to remote port xxxx: Proxy connection timed out. Is the remote port correct?
● Checking server status on port xxx with wget
解决方案 1:
1、编辑服务端的 sshd_config
配置文件:vim /etc/ssh/sshd_config
。
2、修改 AllowTcpForwarding
配置。这个配置默认是注释掉的:#AllowTcpForwarding yes
,即默认是允许 TCP 转发的。除非显式指定了 AllowTcpForwarding no
,这样就禁止了 TCP 转发。有些服务器为了安全,禁止了 TCP 转发,恢复成默认样子即可。
3、如果这样还是无法连接服务器,那么打开 Remote-SSH 插件的配置,禁用 remote.SSH.enableDynamicForwarding
选项。
解决方案 2:
1、VSCode 每次连接远程的时候会通过 wget
校验服务联通性,若没有 wget
则会用 crul
校验,若两个命令都没有,则直接连接失败。
2、既然出现 Checking server status on port xxx with wget
这种错误,那我们直接屏蔽系统 wget
,用脚本写一个假的 wget
,让其始终 exit 0
,这样就可以绕过校验。
解决方案 3:
重启 iptables 服务:systemctl restart iptables
。
这三种解决方案只是摸索出来的,请组合交替使用。
8.3. VSCode 远程连接服务器:远程主机密钥已更改,端口转发已禁用
触发情形:之前用本机远程连接过该服务器,但服务器的密码之后更改过。
解决方法:删除 ~/.ssh/known_hosts
文件,然后重新连接服务器,按照 vscode 的提示依次进行即可。
8.4. 远程使用好好的环境,突然连接不上,看日志提示 wget/curl 正在下载依赖
解决方法:删除服务器端 .vscode-server
的 bin 和 extensions
目录,重新部署服务端即可。