VSCode 的新版本有很好的远程支持。它可以打开远端文件夹,然后进行远端操作,避免了本地与远端的同步问题。但是这篇文章不介绍这个功能,而只是打开一个远端 Jupyter Notebook 的服务,然后在本地使用 ssh 连接到远端进行运算, VSCode 的文件系统依然保持为本地的文件系统。这样做的好处是,远端生成的图片,可以直接在 Jupyter Notebook 中查看,比单纯的 ssh 连接更方便查看数据。

在 Windows 系统中启动 SSH 服务

SSH 是 Secure Shell 的简写,在与 Linux 服务器的连接中经常使用。由于 SSH 运行在命令行,没有图形界面,所以只能查看终端输出,而无法查看图形。但是 Jupyter Notebook 给图形化提供了可能。只要通过 SSH 连接到服务端,再完成正确的 IP 地址映射,就可以运行远端的 Jupyter Notebook ,并在浏览器中直接查看它支持的图片。

新版的 Win 10 提供了 WSL (Windows Subsystem for Linux) 服务。如果使用这个服务,配置服务器的方法和 Linux 基本一致,就不详细介绍了。这里我们不使用 WSL,通过 Win10 提供的内置 OpenSSH 服务,通过 OpenSSH Server 搭建服务器。下面我们来启动 OpenSSH Server 。

首先打开 设置 ,然后进入 应用 > 应用和功能 > 管理可选功能。找到 OpenSSH 服务器 ,点击 安装

安装完成后,在 设置 中找到 服务 ,在服务列表中找到 sshd ,将其启动方式设为 自动 ,并点击 启动

这时,就可以从本地机通过 SSH 访问这台远程机了。如果您的本地机使用 MacOS 或 Linux 操作系统,自带了 SSH 程序。如果是 Windows 操作系统,则需要用相似的方式,安装 OpenSSH 客户端 。打开终端,输入

1
ssh username@servername

就可以建立连接了。 username 是您在服务器中登陆 Windows 系统时的用户名。 servername 是服务器的 IP 地址。可以服务器中查看。如果服务器连接在路由器上,使用的是 192.168 开头的内网 IP ,则需要在路由器中设置端口转发,把 SSH 使用的 22 端口转发到对应的内网 IP 去。如果您的路由器也处于内网,则需要借助花生壳等内网穿透软件。判断是否处于内网,可以打开百度,输入 “IP” ,百度会显示您的当前 IP 地址。如果和您的电脑或路由器 IP 地址不同,则说明您的网络环境为内网。这是你的网络运营商提供的。有些运营商支持致电修改为外网。

另外还要注意,服务器端的防火墙要打开 22 端口。

建立连接之前,会询问用户密码,注意输入时是不显示你在输入的。输入完成按回车即可。

配置 rsa 密钥对

为了方便连接,不用每次都通过输入密码登陆,我们来配置 SSH 密钥对。

SSH 密钥对是一对密钥,分别称为“公钥”和“私钥”。SSH 密钥对在本地生成,然后把公钥拷贝到远端,以进行配对。SSH 密钥对在使用 Git 服务器的时候也会用到,本质都是通过密钥对建立安全的 SSH 连接,配置方法也是一致的。

如果本地机使用 MacOS 或 Linux 操作系统,可以打开终端,输入

1
ssh-keygen -t rsa -C "xxxx@xxxx.com"

其中 -t 表示密钥的种类,一般选用 rsa 就可以了。 -C 表示备注,一般输入您的邮箱即可。回车后,会出现询问文件名,默认即可。注意如果您使用 Github 等其它服务,可能已经生成过密钥对,这里可以使用其它文件名来命名,也可以直接使用已有的密钥对。

如果本地是 Windows 操作系统,在正确安装 “OpenSSH客户端” 后,使用管理员身份打开 PowerShell ,输入

1
ssh-keygen

即可看到提示,生成成功。如果您的 Windows 系统启用了 WSL ,可以直接启动 Linux 终端,使用 Linux 的方法生成。

下面切换到用户目录下,可以看到密钥文件夹 .ssh 。进入,可以看到生成的私钥 id_rsa 和公钥 id_rsa.pub 。这个公钥就是我们要拷贝到服务器端的公钥。用文本编辑器打开这个文件,复制其中的内容。

下面进入服务器端,进入到用户根文件夹,也就是 C:\Users\username ,里面有一个 .ssh 文件夹,进入。在里面建立一个空白文件,把复制的公钥粘贴进来,保存并关闭。然后打开 C:\ProgramData\ssh\sshd_config 文件,其中有一项是 AuthorizedKeysFile ,它的值设置为 .ssh/authorized_keys 。关闭。再进入 设置 中的 服务 ,重启 sshd 服务,配置完成。

下面在本地建立 SSH 连接,会发现,不再询问密码了。

在服务端启动 jupyter Notebook

在服务端打开终端(或通过 SSH 连接),切换到您希望启动 jupyter Notebook 的根目录,输入命令

1
jupyter notebook --no-browser --ip 127.0.0.1 --port 8989

这里的 IP 部分是本地地址的默认 IP ,不要改动。 port 在不冲突的情况下可以自由选择。

在出现的窗口中,有一些提示,其中有一个带有 token 的连接网址。这就是我们远程连接所使用的网址,把它复制下来。

回到本地,建立一个端口映射了的 SSH 连接,输入

1
ssh -L 127.0.0.1:8989:127.0.0.1:8989 username@servername

连接成功后,打开浏览器,输入复制的网址,可以看到熟悉的 jupyter Notebook 界面了。

在 VSCode 中连接远程 jupyter Notebook

VSCode 的 python 插件支持在 VSCode 中直接使用 jupyter Notebook ,不仅支持本地运行,还支持连接远程的 jupyter 服务。打开命令框,找到 “Specify local or remote jupyter server for connections”,再选择 “Existing” ,复制连接网址,确定。根据提示,重新加载 VSCode ,就可以使用了。