配置Visual Studio Code的Remote - SSH插件进行远程开发

有时不得不面临在Windows开发Linux项目的场景。 由于种种问题,这会非常不方便。 如果用远程登录、Samba或者SSH X-Forwarding之类的技术,都会有网络卡顿问题,严重程度与两台机器的网络情况相关。

一些编辑器、IDE提供了不错的手段来解决这个问题,比如IDEA系列的付费版本,但用起来还是有一些问题。 我常用Mosh+Vim,远程开发毫无违和感。

今天要介绍的,则是在2019年6月的1.35.0版本后,vscode(Visual Studio Code)新增支持的Remote功能。 Remote功能由三个插件组成,分别实现三种不同场景的远程开发。

本文主要介绍Remote - SSH的配置和使用,并且详细描述了网络受限条件下的代理配置。

原理简介

在Local的系统上运行和使用vscode,但文件和运行环境却是在Remote的机器上。

Remote Development using SSH

和Samba或SSH的X-Forwarding相比,它使用了更轻量级的通信,也更稳定。

Samba是把Remote指定目录变成Local可访问、可操作的目录。 它经常出现卡顿、掉线等情况,不适合多文件、复杂项目的开发。 而且,运行环境仍然是Local的,不能解决关键问题。

X-Forwording是利用Remote运行的X-server与Local运行的X-client进行通讯,除必要数据外,还包含部分UI数据。 也就是说,UI是在Remote渲染完成,通讯之后,才在Local显示。 并且它还要求SSH的连接稳定,一旦发生网络波动就必须重启整个应用程序。 如果使用这个技术开一个IDE,不仅开发过程中时常出现卡顿,而且还经常被动重启,导致开发流程被强制打断,甚至可能丢失数据。

vscode的Remote - SSH,相当于一个X-Forwording的变种。 Local仅运行UI及相关插件,而Remote则是除UI外的完整运行环境。 二者的交互,仅包含UI需要展示的内容,通讯的数据量大大降低。 在使用过程中,非常流畅。

在稳定性方面,Remote - SSH略有加强,但也不够理想。 SSH如果因网络波动而中断,(和X-Forwording一样)会尝试重连; 如果重连不上,则需要重载workspace。 与完全重启相比,算是轻量级中断吧。 如果使用Mosh之类基于的UDP协议的远程连接,应该可避免上述问题,不知道是否已在开发计划内。

安装

如果还没安装的话,可以用以下方式安装vscode。

在Windows上安装Visutal Studio Code,主要有两种安装方式。 一是通过choco安装:

choco install vscode

这样安装,在初次比较方便,但无法在Windows下使用自动更新功能。

二是通过官网下载(推荐):https://code.visualstudio.com/

安装完成后,还要安装插件Remote - SSH

Local配置

Local是指vscode本体的运行环境,本文以Windows为例来介绍。 如果是Linux,问题会简单很多。

Local代理

修改【Internet 选项】【连接】【局域网设置】,使默认的系统代理可用。 也许,还需要用cntlm建立代理,改成免密可用的形式。

只要系统代理可用,vscode默认配置就可以上网,更新或者下载插件。

如果有证书认证的问题,在【Settings】【Application】【Proxy】中,修改一些配置可能会有所帮助。

{
    "http.proxyStrictSSL": false,
    "http.systemCertificates": false
}

注意http.proxy未必生效。

终端

Windows 7下,默认终端有两个:

它们都有已知问题,缺乏必要的工具如sshgit,不适合作为开发环境。

如果已经安装Git,可以把默认终端调整为Git Bash。 在settings.json添加以下内容:

{
    "terminal.integrated.shell.windows": "D:\\Program Files\\Git\\bin\\bash.exe",
    ...
}

其中D:开头的字符串应替换为Git Bash真正的安装位置。

如果没有安装Git,则推荐安装,否则没有SSH客户端,则无法使用Remote - SSH。 SSH客户端也可通过其它方式安装,但这是最简单地途径。

Remote配置

Remote是指远程开发的目标机器,必须是Linux。 系统要求详见《System requirements》。

Git Bash与SSH配置

首先,安装Git Bash,并确保在其中可以ssh登录到目标机器。 另外,在安装Git Bash时要保证sshcmd.exe的PATH中。 注意安装向导中的【Adjusting your PATH environment】选项,要选第三项 ——【Use Git and optional Unix tools from the Command Prompt】。

由于使用SSH进行通信,因此先要保证SSH可以免密登录。 此外,还需要使用SSH的config配置。 默认情况下,config文件位置是%USERPROFILE%/.ssh/config。 按以下形式,可添加多个Host配置。

Host hangzhou
    HostName 10.xxx.xxx.xxx
    User yanqd0

Host xiamen
    HostName 100.xxx.xxx.xxx
    User yanqd0
    Port 10022

其中,yanqd0是(孤常用的)用户名,使用时按需替换。 Host只是一个名称,可以随意填写一个合法的hostnamePort默认是22,如果使用非22端口则需要额外指定。

Remote代理

Remote的代理配置,显然和Local不同。 因此,如果需要Remote的Linux中配置代理,需要在其Bash中配置环境变量http_proxyhttps_proxy。 由于Remote - SSH在启动时,需要先用wget初始化Remote的vscode server。 因此,Remote必须安装wget,并可选在~/.wgetrc使用以下配置。

use_proxy = yes
http_proxy = http://localhost:3128
https_proxy = https://localhost:3128
check_certificate = off

其中,localhost:3128需要换成一个可用的免密代理。

总结

必要配置已经完成了,之后就可以在左侧新增的Remote - SSH侧边栏中, 通过点击登录相关机器,打开远程workspace,使用远程环境开发。

使用过程中,要注意在workspace运行的插件,要在对应的Remote安装才能使用,仅仅在Local安装是无用的。 此外,Settings中的配置也有独立的一份,需要按需调整。

熟练运用之后,效率可以提高很多。

参考