开门见山

我们的目的便是通过Visual Studio Code,以下简称vscode,这个著名且免费的IDE来进行远程开发。本篇特指通过SSH连接远程服务器进行开发这一类需求,并且实现近乎本地开发的体验。特别是针对Jupyter Notebook的体验,配合vscode的notebook插件,效果是真的很好。

为了行文方便,在文中我将对以下名称的叫法进行统一:

  • Visual Studio Code这个软件 » » » vscode
  • 你的远程服务器,通常是Linux系统 » » » 远程服务器
  • 你的本地主机,可能是Windows系统、macOS系统或者Linux系统 » » » 宿主机
  • Remote-SSH这个vscode的插件 » » » remote插件
  • Jupyter Notebook这个工具 » » » notebook
  • vscode的扩展或者插件功能,英文名extension » » » 插件

vscode能获得如此成功,在我看来,很大一部分要归功于其开源的伟大以及丰富且活跃开发的插件(扩展)市场。进行远程开发,也是由Remote-SSH这个插件实现的,以下简称为remote插件。

Remote-SSH插件

远程开发其实远不止通过SSH连接远程服务器,还包含了:

  • Windows宿主机连接本地的WSL(Windows Subsystem for Linux)子系统。
  • 连接本地的Docker镜像。
  • 连接GitHub的代码空间(Codespaces)。

所以进行远程开发的第一步,就是下载vscode并且安装remote插件,安装后在左下角会出现一个远程连接的快捷图标。

安装remote插件

配置服务器信息

点击左下角的快捷图标后,针对远程开发的不同对象选择对应选项,我们这里选择连接到主机。接下来便是填写具体的远程服务器信息,提供两种方式进行参考。

方法一:ssh命令

ssh命令登录

可以直接在输入框中输入完整的ssh命令即可成功进行配置。注意username替换为自己的用户名,host替换为远程服务器的IP地址或者域名,port替换为远程服务器的端口。需要跳板机的情况下,-J后输入的同样是在跳板机上面的用户名、跳板机Host以及跳板机端口。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 默认port为22
# username@后面 可以是ip地址 也可以是域名 其实叫host更准确
# 需要跳板机的意思是 只能通过先登录到跳板机 再在跳板机中登录到最终的目标服务器
# 通常是为了安全考虑 目标服务器并不直接暴露在公网中 而是与跳板机处于同一内网

# 第一种情况 不需要跳板机
ssh username@host:port

# 第二种情况 需要跳板机 增加-J参数
ssh username@ip:port -J username@ip:port

方法二:config文件

通过输入ssh命令成功连接到服务器后,vscode会自动将远程服务器相关配置信息保存到config配置文件中,所以理所当然的可以直接编辑config文件达到与命令一致的效果。点击连接到主机 -> 配置SSH主机后,通常选择自己用户目录下的.ssh/config文件,如图就是yuesir用户。

配置文件

同样的,针对是否需要跳板机,给出两种配置文件格式,特别注意,这里的Host是服务器的名称,这只是一个昵称,方便用户快速辨认,可以随意指定,中英文均可。注意区别ssh命令中host的含义,配置文件中HostName才是与命令中host一致的含义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 不需要跳板机
Host 服务器名称
  HostName 服务器Host(IP或者域名)
  Port 服务器端口
  User 用户名

# 需要跳板机
Host 目标服务器名称
  HostName 目标服务器Host(IP或者域名)
  Port 目标服务器端口
  User 用户名
  ProxyJump 跳板机的用户名@跳板机的Host:跳板机的端口
  
# 例如
Host 月青悠的服务器
  HostName 192.168.1.2
  Port 22
  User yuesir
  ProxyJump yuesir@192.168.1.1:22

异常情况

这里需要多提醒一下,在连接过程中可能会遇到一直卡在正在下载 VS Code 服务器这个状态,原因就是远程服务器不能正常连接到vscode-server的地址,可能是由于服务器本身不通网,也可能是下载地址被墙不能直接访问。可以通过在本地宿主机手动下载后上传到服务器的方式解决这个问题,这里给出几篇文章以供参考。

配置免密登录

单独将这一小节拿出来介绍,主要是因为手动输入密码实在是太!麻!烦!啦!!!

这对于懒人来说实在是折磨,更别说还存在某些远程服务器需要单独配置VPN进行访问的情况,这时如果VPN效果不太稳定,经常会出现断连需要重新输入密码的情况。好在SSH早就考虑过这个问题了,通过配置密钥登录,不仅方便还安全(对我来说主要是方便。。。

同时这也是vscode官网教程推荐的方式,原文如下:

We recommend using key-based authentication (if you use a username/password, you’ll be prompted to enter your credentials more than once by the extension).

检查宿主机密钥对

1
2
3
4
5
6
7
8
# 首先确认用户主目录(~)下是否存在密钥对
ls -la ~ | grep .ssh

# 如果存在.ssh目录
# 检查是否存在密钥文件
ls -la ~/.ssh | grep id_rsa
# 或者
ls -la ~/.ssh | grep id_ed25519

如果存在类似的文件则跳过下面的创建宿主机密钥对步骤。

宿主机密钥对

这是插播一个知识点,之所以会存在多种(两种)可能的密钥文件,主要是由于加密算法的不同。更具体来说主要是RSA算法与Ed25519算法。

命令ssh-keygen -t rsa -b 4096ssh-keygen -t ed25519
密钥类型RSAEd25519
性能较慢(但仍足够快)更快
安全性更高
兼容性与旧系统兼容性更好某些非常旧的系统可能不支持

其实就是安全性、性能与兼容性的取舍,默认使用ssh-keygen -t ed25519即可。

创建宿主机密钥对

Windows系统打开cmd(命令提示符)或者Windows PowerShell,macOS或者Linux直接打开终端(Terminal)即可。如图是Windows 10系统使用cmd进行操作的示意图。

创建密钥对操作示意图

存在两种方式:

1
2
3
4
5
6
7
8
9
# Ed25519
# 优先使用
# 默认创建 id_ed25519.pub 和 id_ed25519
ssh-keygen -t ed25519

# RSA
# 兼容使用
# 默认创建 id_rsa.pub 和 id_rsa
ssh-keygen -t rsa -b 4096

系统会提示输入安全密码,但可以直接回车(Enter),相当于将密码留空。现在应该有一个id_ed25519.pub或者id_rsa.pub文件,其中就包含了公共密钥,还有一个对应的没有.pub后缀的文件,那是你的私钥。特别提醒:.pub公钥可以公开,但是没有后缀的私钥不能公开给其他人。

添加公钥到远程服务器

如果你是购买的云服务器,那么通常可以在购买的页面或者机器信息页面填入或者上传你的公钥。图为官方教程的一个截图。

云服务器填入公钥

这是一种比较直观的配置方式,但有时候并不适用。我们的远程服务器可能就是一个IP加上用户名和密码,这时候可以使用命令行的方式或者手动编辑。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 方法一:宿主机命令行
# 宿主机上运行
# 公钥文件改为自己具体的路径和名称
# 后面接的 username@host:port 与前文连接远程服务器的命令保持一致
ssh-copy-id -i ~/.ssh/id_ed25519.pub 远程服务器的用户名@远程服务器的host:远程服务器的端口

# 方法二:手动编辑
# 首先在宿主机上操作 复制公钥文件内容
# 可以通过cat vim等命令 也可以直接在文件管理中打开公钥文件直接进行复制
# 接着在远程服务器上运行命令 这里以vim编辑器为例
vim ~/.ssh/authorized_keys
# 点击 i 进入编辑模式
# 如果文件存在内容 移动方向键将光标移动到内容末尾然后回车换行即可
# 如果文件不存在vim会自动创建 此时还是点击 i 进入编辑模式
# 将复制的公钥文件内容直接粘贴到这个文件中即可
# 点击 Esc 退出编辑模式
# 输入以下命令即可保存文件并退出vim编辑器
:wq

此时就可以关闭vscode并且尝试重新连接远程服务器,如果不需要手动输入密码即为成功。接下来的内容针对于特定编程语言与notebook工具,请选择性阅读。

Python

使用vscode在远程服务器进行开发,同样需要在远程服务器上安装对应的插件。在这一点的操作上与本地几乎无异,只是需要注意安装到远程服务器上而不是宿主机。vscode会主动提醒你安装必须的插件,这里仅稍作记录。

远程服务器安装插件

当然还是推荐搭配Conda进行环境管理,具体的介绍可以查看下面文章。

Conda安装R内核的Notebook
2022-10-10   #conda #r #jupyter #droplet
由于博主多次在Linux远程服务器上使用conda配置r内核的jupyter notebook,但每次时间一久就会忘记某些步骤(最主要是一样的坑每次都会踩出不一样的问题)。在综合网上相关教程以及自己的亲身经验后,总结出一份安装指北,供大家以及将来的我参考。
Conda环境备份与迁移
2024-06-29   #conda #conda pack #droplet #deep learning
最近,我遇到了一个需要迁移 Conda 环境的场景。通常来说,深度学习项目的环境搭建是相当复杂的,因为依赖包之间的版本关系非常紧密,而且硬件驱动的版本也常常有限制。如果能够直接将已经配置好的环境从一台服务器迁移到另一台服务器,将大大节省时间和精力。

关于notebook与R或者Python的联动,请查阅下一章节Notebook。

Notebook

关于notebook配置的文章本博客写了比较多,整理如下。需要说明的是,一是下面文章撰写的时间比较早了,那时候还是notebook的6版本,现在都已经进入7大版本了。

对于没有了解过notebook的童鞋,可以查阅一下安装教程以及官方文档

如果需要一个比较详细的操作教程,可以在评论区留言(尽量不鸽

R与Notebook

R语言并不是只能在RStudio或者RStudio Server中使用,配合Notebook,我觉得可视化更为方便。

Conda安装R内核的Notebook
2022-10-10   #conda #r #jupyter #droplet
由于博主多次在Linux远程服务器上使用conda配置r内核的jupyter notebook,但每次时间一久就会忘记某些步骤(最主要是一样的坑每次都会踩出不一样的问题)。在综合网上相关教程以及自己的亲身经验后,总结出一份安装指北,供大家以及将来的我参考。
Brew安装R内核的Notebook
2023-01-16   #brew #r #jupyter
我在另一篇文章介绍了在Linux远程服务器上使用conda配置r内核的jupyter notebook,但我发现conda对于各种依赖冲突处理不好,经常导致安装不成功。在macOS系统下本机使用brew进行安装更加简单快捷,总结出来步骤供大家以及将来的我参考。

Python与Notebook

这里还记录了一些常见的问题,但是现在使用vscode来操作notebook后,方便了很多,基本上已经不用看了。

Conda安装R内核的Notebook
2022-10-10   #conda #r #jupyter #droplet
由于博主多次在Linux远程服务器上使用conda配置r内核的jupyter notebook,但每次时间一久就会忘记某些步骤(最主要是一样的坑每次都会踩出不一样的问题)。在综合网上相关教程以及自己的亲身经验后,总结出一份安装指北,供大家以及将来的我参考。

感谢

VS Code Remote Development

Remote development over SSH