## 一、remote - SSH

### 1. 简介

> 参考 [Remote Development using SSH](https://code.visualstudio.com/docs/remote/ssh) 或者 [使用 SSH 进行远程开发 - VSCode · AI 代码编辑器](https://vscode.js.cn/docs/remote/ssh)

**Visual Studio Code Remote - SSH** 扩展允许我们在任何远程机器、虚拟机或运行 SSH 服务器的容器上打开一个远程文件夹，并充分利用 VS Code 的功能集。连接到服务器后，我们可以与远程文件系统中的任何文件和文件夹进行交互。

<img src="./LV500-RemoteSSH/img/architecture-ssh.png" alt="SSH Architecture"  />

### 2. 扩展安装

#### 2.1 要安装哪些？

这里在有网的环境下，安装了 Remote - SSH 插件后，会自动安装另外两个插件，没网的话，可以手动下载 VSIX 文件后安装。

| 扩展名称                                  | 说明                                                         |
| ----------------------------------------- | ------------------------------------------------------------ |
| Remote - SSH                              | 通过 SSH 打开远程机器上的任意文件夹，并充分利用 VS Code 的全部功能。 |
| Remote Explorer                           | 查看可用于 SSH 和隧道的远程计算机。                          |
| Remote - SSH: Editing Configuration Files | 编辑 SSH 配置文件                                            |

其中 Remote Explorer 这个插件安装之后在活动栏会出现一个远程资源管理器的图标，后续可以通过这里方便的管理远程服务器：

<img src="./LV500-RemoteSSH/img/image-20250516210242321.png" alt="image-20250516210242321"  />

#### 2.2 离线VSIX下载

```shell
# https://marketplace.visualstudio.com/_apis/public/gallery/publishers/{发布者}/vsextensions/{插件名}/{版本号}/vspackage
https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-vscode-remote/vsextensions/remote-ssh/0.120.0/vspackage

https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-vscode/vsextensions/remote-explorer/0.5.0/vspackage

https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-vscode-remote/vsextensions/remote-ssh-edit/0.87.0/vspackage
```

## 二、Visual Studio Code Server

> 参考 [Visual Studio Code Server](https://code.visualstudio.com/docs/remote/vscode-server) 或者 [Visual Studio Code Server - VSCode · AI 代码编辑器](https://vscode.js.cn/docs/remote/vscode-server)

“VS Code Server”，它是一个基于与远程扩展相同的底层服务器构建的服务，并具有一些其他功能，例如交互式 CLI 和促进与 vscode.dev 的安全连接。

<img src="./LV500-RemoteSSH/img/server-arch-latest.png" alt="The VS Code Server architecture"  />

我们想要通过 ssh 连接到远程服务器，远程服务器中需要有 Visual Studio Code Server，有网络的情况下在登录的时候可以自动下载，可以跳过这一部分。

### 1. 获取 vscode 的提交记录

如果是在有网的环境下，我们可以直接在 vscode 中向 linux 服务器端安装 Visual Studio Code Server，但是对于没有网的环境，我们可以这样做，点开 vscode【帮助】&rarr;【关于】可以得到 vscode 的版本信息：

<img src="./LV500-RemoteSSH/img/image-20250516203615179.png" alt="image-20250516203615179"  />

我们记下当前使用的 vscode 的提交信息：

```shell
版本: 1.100.2 (user setup)
提交: 848b80aeb52026648a8ff9f7c45a9b0a80641e2e
日期: 2025-05-14T21:47:40.416Z
```

### 2. 下载 vscode-server-linux

从 1.86.1 版本开始，vscode-server 在 linux 中的目录结构就发生了变化了，因为它们默认安装的 Remote - SSH 都是不一样的，vscode server 的目录结构是这个插件版本决定的，我自己下了 [VSCodeUserSetup-x64-1.86.1](https://update.code.visualstudio.com/1.86.1/win32-x64-user/stable)(这个版本默认装的 Remote - SSH 版本为 0.108.0) 和 [VSCodeUserSetup-x64-1.85.2](https://update.code.visualstudio.com/1.85.2/win32-x64-user/stable)（这个版本默认装的 Remote - SSH 版本为 0.107.1）试了一下发现是从这个 0.107.1 这个还是下的旧版本，0.108.0 就是新版本了。

而且从 1.86 版本开始，glibc 库版本需要在 2.28 以上（[January 2024 (version 1.86)](https://code.visualstudio.com/updates/v1_86#_linux-minimum-requirements-update)）后面还会提到这个事情，所以从这个版本之后服务器中 c 库版本太低的话就不能使用 ssh remote 插件了。

#### 2.1 旧版离线包

可以将上面的提交 id 替换到下面的 commit_id 中：

```shell
#x86:
https://update.code.visualstudio.com/commit:${commit_id}/server-linux-x64/stable
#arm:
https://update.code.visualstudio.com/commit:${commit_id}/server-linux-arm64/stable
```

> 实际上 vscode 版本还分 stable 和 insider 的，vscode 为蓝色图标的为 stable 版，绿色图标的为 insider 版。insider 版需要将上述链接最后的 stable 改成 insider。
>
> 对于 arm 的 64 位机器，需要将链接中的 x64 改成 arm64，如下所示。（对于一些较新版本的 vscode 客户端，可能还没有 arm64 的服务端，1.72.2 版本的客户端是有的）。
>
> ```shell
> https://update.code.visualstudio.com/commit:${commit_id}/server-linux-arm64/stable
> ```

注意将\${commit_id}替换为刚刚查到的 commit id。在这里就是：

```shell
https://update.code.visualstudio.com/commit:848b80aeb52026648a8ff9f7c45a9b0a80641e2e/server-linux-x64/stable
```

然后我们就会得到这样的一个压缩包：

<img src="./LV500-RemoteSSH/img/image-20250516204531508.png" alt="image-20250516204531508"  />

#### 2.2 新版离线包

在某次更新后远程端的 .vscode-server 目录结构发生变化：

<img src="./LV500-RemoteSSH/img/image-20250516235450506.png" alt="image-20250516235450506" />

后面新版和旧版的就变成了下图这种结构：

```shell
📦.vscode-server
 ┣━ 📁bin  # 存放旧方法下的vscode commit相关文件
 ┃   ┗━ 📁${commit_id1}
 ┃   ┗━ 📁${commit_id2}
 ┃   ┗━ ···
 ┣━ 📁cli  # 存放新方法下的vscode commit相关文件
 ┃   ┗━ 📁servers
 ┃   ┃   ┗━ 📁Stable-${commit_id}
 ┃   ┃   ┃   ┗━ 📁server # vscode-server-linux-arm64.tar.gz
 ┃   ┃   ┃   ┗━ ···
 ┃   ┃   ┗━ ···
 ┃   ┗━ 📜iru.json  # 存放最近的vscode commit_id
 ┣━ 📜code-${commit_id} # 存放vscode_cli_alpine_x64_cli.tar.gz解压后名为code的文件,并将其改名为code-${commit_id}
 ┣━ 📁data
 ┗━ 📁extensions
```

现在需要安装两个文件, 两个文件的下载地址如下:

```shell
# x86:
https://vscode.download.prss.microsoft.com/dbazure/download/stable/${commit_id}/vscode-server-linux-x64.tar.gz
https://vscode.download.prss.microsoft.com/dbazure/download/stable/${commit_id}/vscode_cli_alpine_x64_cli.tar.gz

# arm:
https://vscode.download.prss.microsoft.com/dbazure/download/stable/${commit_id}/vscode-server-linux-arm64.tar.gz
https://vscode.download.prss.microsoft.com/dbazure/download/stable/${commit_id}/vscode_cli_alpine_arm64_cli.tar.gz

```

在这里就是：

```shell
https://vscode.download.prss.microsoft.com/dbazure/download/stable/848b80aeb52026648a8ff9f7c45a9b0a80641e2e/vscode-server-linux-x64.tar.gz
https://vscode.download.prss.microsoft.com/dbazure/download/stable/848b80aeb52026648a8ff9f7c45a9b0a80641e2e/vscode_cli_alpine_x64_cli.tar.gz
```

会得到下面两个压缩包：

<img src="./LV500-RemoteSSH/img/image-20250516231129415.png" alt="image-20250516231129415" />

### 3. 服务器端安装

#### 3.1 旧版离线包安装

- 创建对应的目录

```shell
mkdir -p ~/.vscode-server/bin/${commit_id}
```

当前版本下就是：

```shell
mkdir -p ~/.vscode-server/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e
```

- 解压 vscode-server-linux-x64.tar.gz

```shell
tar -zxvf vscode-server-linux-x64.tar.gz --strip-components=1 -C ~/.vscode-server/bin/${commit_id}
```

这个压缩包解压后还存在顶层目录：

```shell
vscode-server-linux-x64
├── bin
├── extensions
├── LICENSE
├── ...
└── product.json

4 directories, 4 files
```

要去掉这一层目录，就要加上--strip-components = 1，在这里就是：

```shell
tar -zxvf vscode-server-linux-x64.tar.gz --strip-components=1 -C ~/.vscode-server/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e
```

最终目录结构为：

```shell
/home/user_name/.vscode-server/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e/
├── bin
├── extensions
├── ...
└── product.json

4 directories, 4 files
```

#### 3.2 新版离线包安装

- 创建对应的目录

```shell
mkdir -p ~/.vscode-server/cli/servers/Stable-${commit_id}
```

在这里就是：

```shell
mkdir -p ~/.vscode-server/cli/servers/Stable-848b80aeb52026648a8ff9f7c45a9b0a80641e2e
```

- 解压 vscode-server-linux-x64.tar.gz

```shell
tar -zxvf vscode-server-linux-x64.tar.gz
# mv vscode-server-linux-x64  ~/.vscode-server/cli/servers/Stable-${commit_id}/server
mv vscode-server-linux-x64  ~/.vscode-server/cli/servers/Stable-848b80aeb52026648a8ff9f7c45a9b0a80641e2e/server
```

- 解压 vscode_cli_alpine_x64_cli.tar.gz

```shell
tar -zxvf vscode_cli_alpine_x64_cli.tar.gz
# mv code  ~/.vscode-server/code-${commit_id}
mv code  ~/.vscode-server/code-848b80aeb52026648a8ff9f7c45a9b0a80641e2e
```

- 目录结构如下：

<img src="./LV500-RemoteSSH/img/image-20250516232725186.png" alt="image-20250516232725186" />

### 4. 连接远程服务器

#### 4.1 服务器端 SSH

首先服务器端需要安装好 openssh-server：

```shell
 sudo apt-get install openssh-server
 ps -e |grep ssh
```

<img src="./LV500-RemoteSSH/img/image-20250516224915958.png" alt="image-20250516224915958" />

#### 4.2 windows 可以 ping 通服务器

```shell
ping xxx.xxx.xxx.xxx
```

#### 4.3 连接远程服务器

- （1）新建远程连接

<img src="./LV500-RemoteSSH/img/image-20250516225535769.png" alt="image-20250516225535769" />

```shell
ssh <user>@<hostname>:[port]
# user: 是在远程服务器上的用户名；
# hostname: 远程服务器的主机名或IP 地址；
# port: SSH 连接的端口号(默认为 22)
```

> Tips：其实一般是可以不写端口号的。

- （2）后面就一直根据提示即可，当最后输入完密码，若是有联网，就会在服务器端安装 vscode server，若是没有联网，则参考上一节的笔记，离线安装。

<img src="./LV500-RemoteSSH/img/image-20250516225803761.png" alt="image-20250516225803761" />

- （3）安装完成后，服务器端会生成以下目录：

<img src="./LV500-RemoteSSH/img/image-20250516225941241.png" alt="image-20250516225941241" />

目录结构如下所示：

<img src="./LV500-RemoteSSH/img/image-20250516235450506.png" alt="image-20250516235450506" />

然后我们就可以开始使用 ssh remote 工具进行远程开发了。

#### 4.4 ssh remote 日志分析

- 以 [VSCodeUserSetup-x64-1.86.1](https://update.code.visualstudio.com/1.86.1/win32-x64-user/stable) 为例，这个版本装的 Remote - SSH 版本为 0.108.0

具体的过程其实可以看一下 vscode 的输出窗口：

<img src="./LV500-RemoteSSH/img/image-20250519201515235.png" alt="image-20250519201515235"  />

我们注意看这里这一行：

```shell
/home/sumu/.vscode-server/code-31c37ee8f63491495ac49e433b8544550fbae4533
```

这里的 31c37ee8f63491495ac49e433b8544550fbae4533 其实就是 vscode 的提交 ID 了，这个其实就是前面我们离线下载的 vscode_cli_alpine_x64_cli.tar.gz 压缩包，再往后看，可以看到这么一段：

<img src="./LV500-RemoteSSH/img/image-20250519201806839.png" alt="image-20250519201806839" />

有没有很熟悉？就是前面下载的 vscode-server-linux-x64.tar.gz 离线包要解压的位置。

- [VSCodeUserSetup-x64-1.85.2](https://update.code.visualstudio.com/1.85.2/win32-x64-user/stable) 为例，这个版本装的 Remote - SSH 版本为 0.107.1

<img src="./LV500-RemoteSSH/img/image-20250519202622514.png" alt="image-20250519202622514" />

其实从这里可以看到，这个就是老版的离线包了。

- [VSCodeUserSetup-x64-1.100.2](https://update.code.visualstudio.com/1.100.2/win32-x64-user/stable) + Remote - SSH 版本为 0.107.1？

<img src="./LV500-RemoteSSH/img/image-20250519203647282.png" alt="image-20250519203647282" />

会发现，其实这个目录结构主要是 Remote - SSH 插件版本决定的，我没有找到这个插件的发布说明，在网上找到有一篇文章：

```shell
问题出在vscode Remote SSH插件（0.106.1版本）。在该版本的插件代码中，开发者们设计了新的ssh连接实现方法（发生改变的还有.vscode-server的目录结构），但显然他们没有排除完bug。所以，在0.106.2版本中他们改回了原来的方法。对于vscode版本为1.82.0且Remote SSH插件版本为0.106.2的设备，配置vscode-server的方式暂且照旧。
```

这一段是这篇文章中的：[解决 Visual Studio Code 更新后一直卡在下载 vscode-server 问题的方法 - 知乎](https://zhuanlan.zhihu.com/p/655289233)

#### 4.5 Remote SSH 连接流程

这里大概了解下连接的流程：

```shell
# 1. 每个版本的vscode都对应一个commit id，当远程连接到服务器时，本地设备上vscode的commit id会被传上去；
# 2. 如果在.vscode-server/bin/目录下有与传上去的commit id同名的文件夹（旧方法），或者在.vscode-server/目录下有code-${commit id}文件，同时有.vscode-server/cli/servers/Stable-${commit id}/server文件夹（新方法），服务器会直接完成远程链接的相关工作；
# 3. 如果不符合第2步中提到的情况，在完成远程连接的相关工作前，服务器就会试图从vscode官方提供的网站下载对应的文件并把它们放到相应的目录下；
# 4. vscode每次更新版本时就会换commit id，所以每次更新后服务器都会执行第3步中提到的操作；
```

> 为什么 vscode 有时不能完成上述工作以至于需要我们自行完成相关操作?
>
> （1）自 2023 年的某月始，出于某些未知原因，vscode 官方提供的网站 [https://update.code.visualstudio.com](https://update.code.visualstudio.com) 无法稳定访问。因此，我们需要把该网址换成国内的 cdn [https://vscode.download.prss.microsoft.com](https://vscode.download.prss.microsoft.com)
>
> （2）我们自己开发的时候可能会在内网，那么就意味着我们无法连接外网实现自动下载。

#### 4.6 免密连接

前边我们已经可以正常链接到服务器，并可以打开服务器上的文件了，但是，有没有发现，每一次连接都需要输入密码，每一次打开文件夹还是需要输入密码，略显麻烦，我们可以将 windows 下的公钥添加到服务器中。

##### 4.6.1 生成 SSH 公钥和私钥

在 windows 下，我们可以打开 powershell，然后输入以下命令创建 SSH 公钥和私钥：

```shell
# 这里其实随便一个字符串就可以
ssh-keygen -t rsa -C "email_address"
```

然后一路 enter 下去就可以了，最终会在 C:\\Users\\&lt; user_name&gt;.ssh 目录下生成这两个文件：

<img src="./LV500-RemoteSSH/img/image-20221029130247828.png" alt="image-20221029130247828" style="zoom:50%;" />

如果以前就有这两个文件的话，重新生成的文件会覆盖以前的文件，比如我之前就在 win 下使用 git ，就配置过 ssh，所以这里我可以直接使用相应的公钥文件，而不必重新生成。

##### 4.6.2 添加公钥到服务器

接下来，我们需要将 id_rsa.pub （公钥）添加到服务器的 **authorized_keys** 中去：

```shell
sumu@sumu-virtual-machine:~$ cd .ssh/

sumu@sumu-virtual-machine:~/.ssh$ ls
config  id_ed25519  id_ed25519.pub  known_hosts
```

我们进入服务器的 ~/.ssh 目录下，查看一下是否存在 authorized_keys 文件，可以发现，我的服务器中是没有这个文件的，我们可以新建这个文件，要是原来就有这个文件的话，我们最好使用追加的方式添加到这个文件中。

```shell
cat ~/1sharedfiles/6temp/id_rsa.pub >> authorized_keys 
```

我是将公钥文件放在 ~/1sharedfiles/6temp/ 目录下，所以这里我们使用这样一个路径，通过上边的命令将公钥里边的内容追加到 authorized_keys 文件。然后我们从 win 中的 VScode 链接到服务器并打开相关文件，就会发现不需要输入密码了。

## 三、常见问题

### 1. GLIBC 问题

#### 1.1 报错信息

上面即便是下载了新版本的离线包，有可能还是会出问题，如：

<img src="./LV500-RemoteSSH/img/image-20250517092208549.png" alt="image-20250517092208549"  />

我们可以打开输出窗口看一下报错信息：

<img src="./LV500-RemoteSSH/img/image-20250517092246568.png" alt="image-20250517092246568"  />

都是在说]远程主机可能不符合 glibc 和 libstdc++ Vs code 服务器的先决条件，其实去查一下 vscode 的发布记录，会发现在 1.86 版本有如下说明：

>[Linux minimum requirements update](https://code.visualstudio.com/updates/v1_86#_linux-minimum-requirements-update)
>
>In this milestone, we have updated the toolchains to build our desktop client. From this release onwards, VS Code desktop is only compatible with Linux distributions based on glibc 2.28 or later, and glibcxx 3.4.25 or later, such as Debian 10, RHEL 8, or Ubuntu 20.04.
>
>If you are unable to upgrade your Linux distribution, the recommended alternative is to use our [web client](https://code.visualstudio.com/docs/setup/vscode-web). If you would like to use the desktop version, then you can [download the VS Code release 1.85](https://code.visualstudio.com/updates/v1_85). Depending on your platform, make sure to disable updates to stay on that version. A good recommendation is to set up the installation with [Portable Mode](https://code.visualstudio.com/docs/editor/portable).
>
>​                             ——[January 2024 (version 1.86)](https://code.visualstudio.com/updates/v1_86#_linux-minimum-requirements-update)

其实也没必要回退这么多吧，我们继续看发布信息，会发现在 1.99 版本中有说明

>[Linux legacy server support has ended](https://code.visualstudio.com/updates/v1_99#_linux-legacy-server-support-has-ended)
>
>As of release 1.99, you can no longer connect to these servers. As noted in our [1.97 release](https://github.com/microsoft/vscode-docs/blob/main/remote-release-notes/v1_97.md#migration-path-for-linux-legacy-server), users that require additional time to complete migration to a supported Linux distro can provide custom builds of `glibc` and `libstdc++` as a workaround. More info on this workaround can be found in the [FAQ](https://aka.ms/vscode-remote/faq/old-linux) section.
>
>​                             ——[March 2025 (version 1.99)](https://code.visualstudio.com/updates/v1_99#_remote-development)

可以看到，结合上面的 1.86 的发布信息，这里大概就是说 1.99 版本开始就停止支持老版本的库吧，反正大概这个意思，也就是说无法升级库的话，理论上最新应该是可以用到 1.99 的上一个版本？这个我没有去验证了，不能用就回退或者更新 c 库。

#### 1.2 GLIBC 库版本

可以看一下服务器中 libc 库的版本：

```shell
$ cat `gcc -print-file-name=libc.so`
# 一般是 /lib/x86_64-linux-gnu/libc.so.6
$ ls /lib/x86_64-linux-gnu/libc.so.6 -alh # 查看 软链接指向的库，一般会直接有版本信息
$ /lib/x86_64-linux-gnu/libc.so.6         # 直接执行这个动态库
```

如果服务器的 libc 库可以升级，那就升级库就行了，要是不能升级，就换 [February 2025 (version 1.98)](https://code.visualstudio.com/updates/v1_98) 版本，可以在这里下载：[VSCodeUserSetup-x64-1.98.2](https://vscode.download.prss.microsoft.com/dbazure/download/stable/ddc367ed5c8936efe395cffeec279b04ffd7db78/VSCodeUserSetup-x64-1.98.2.exe)

### 2. 主机密钥验证失败

有的时候我们把远程服务器重装了，或者直接换了一个系统，但是 IP 不变的话，重新使用使用 ssh 登录可能会有下面的报错：

```shell
[22:42:35.392] Using connect timeout of 17 seconds
[22:42:35.392] Terminal shell path: C:\WINDOWS\System32\cmd.exe
[22:42:35.599] > 
[22:42:35.599] Got some output, clearing connection timeout
[22:42:35.761] > @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
[22:42:35.788] > @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
> Someone could be eavesdropping on you right now (man-in-the-middle attack)!
> It is also possible that a host key has just been changed.
> The fingerprint for the ED25519 key sent by the remote host is
> SHA256:vl0RPGocA9y1JNJwrCRd2bTavVc3ywzSG7GDoRUITv8.
> Please contact your system administrator.
> Add correct host key in C:\\Users\\20380/.ssh/known_hosts to get rid of this message.
> Offending ECDSA key in C:\\Users\\20380/.ssh/known_hosts:17
> Host key for 124.221.173.8 has changed and you have requested strict checking.
> Host key verification failed.
```

这里其实已经很明显的告诉我们了：`Host key verification failed.`，这里就是问题产生的原因，**SSH 主机密钥验证失败**，导致连接被中止。那么为什么会验证失败？前面其实已经给出警告了：`REMOTE HOST IDENTIFICATION HAS CHANGED!`，若是我们删除了远程服务器的 ssh 密钥配置，或者直接重装了，这个时候本地 `%USERPROFILE%/.ssh/known_hosts` 中已经存储的公钥并不会自动更新，而且有这个历史记录在，也不会让我们重新输入密码重新登录，就会导致上面一直是失败的。

我们可以直接删除 `%USERPROFILE%/.ssh/known_hosts` 中服务器 IP 对应的部分或者执行下面的命令：

```shell
ssh-keygen -R 124.221.173.8
```

然后重新使用 ssh 连接就可以了。为什么 MobaXterm 可以自动更新？其实也没有啦，只是每次创建的时候，MobaXterm 会提示我们而已。

> 参考资料：
>
> [VS Code 远程开发 - VSCode · AI 代码编辑器](https://vscode.js.cn/docs/remote/remote-overview) 、[VS Code Remote Development](https://code.visualstudio.com/docs/remote/remote-overview)
>
> [vscode 远程 linux(包括离线 vscode-server 安装，免密登录方法)_vscode-server-linux-CSDN 博客](https://blog.csdn.net/qq_43623902/article/details/136258880)
