返回

使用SSH实现VSCode远端互联

前言

在虚拟机中使用VSCode编程时时常卡死,查阅资料后发现有许多人遇到此问题,原因可能是VSCode的默认GPU加速问题,需要修改配置文件关闭。由于我在宿主机使用VSCode不卡顿,遂考虑将前端放置宿主机开发,但又会产生宿主机与虚拟机中项目文件不一致,需要时常来回拷贝覆盖的问题,突然看到有使用SSH实现VSCode远端互联的方法,恰好可以解决我的问题,特此记录。

环境

  • Windows 11 专业版
  • VMware 17 pro
  • Ubuntu 22.04.2
  • VSCode 1.85.1

配置

口令登录

服务端

  1. 在Ubuntu上安装SSH服务器。打开终端,并依次运行以下命令来安装OpenSSH服务器,并启动SSH服务器:
1
2
3
sudo apt update
sudo apt install openssh-server
service sshd restart

客户端

  1. 打开Windows上的VS Code,安装“Remote - SSH”扩展。

  1. 打开VSCode侧边栏的远程资源管理器,右键SSH,选择配置SSH文件

  1. 在文件中输入远端的IP和用户名,再定义该连接的名称即可

在该配置文件中可以配置多个Linux服务器信息

  1. 重新打开VSCode侧边栏的远程资源管理器即可,连接成功后,VS Code会打开一个新的窗口,显示Ubuntu上的文件系统(可以使用“文件”>“打开文件夹”浏览和打开远端目录中的文件夹)

Windows环境中需要提前安装有OpenSSH

  1. 在宿主机VSCode中修改文件后,打开虚拟机可以看到对应文件也同步修改成功。

注意两端的插件是不互通的,需要按照需要自己下载安装

  1. 打开终端也可以看到是远端的终端

如果要结束 SSH 连接,可以使用“文件”>“关闭远程连接”返回到在本地运行 VS Code。

免密登录

客户端

  1. 生成公私钥对
1
2
cd ~/.ssh/
ssh-keygen -t rsa -f "wireguard"   # -t表示类型选项,这里采用rsa加密算法
  1. 将公钥复制到远程主机的 ~/.ssh/authorized_key 文件中
1
ssh-copy-id -i ~/.ssh/wireguard.pub 用户名@ip

win系统中需要在powershell下先执行,注意下面的wireguard.pub要用第一步自己写的文件名

1
2
3
4
5
6
7
8
9
 function ssh-copy-id([string]$userAtMachine, $args){   
    $publicKey = "$ENV:USERPROFILE" + "\.ssh\wireguard.pub"
    if (!(Test-Path "$publicKey")){
        Write-Error "ERROR: failed to open ID file '$publicKey': No such file"            
    }
    else {
        & cat "$publicKey" | ssh $args $userAtMachine "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"      
    }
}
  1. 配置~/.ssh/config文件,
1
2
3
4
5
Host wireguard
    HostName 192.168.1.135
    User wyatt
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/wireguard 
  • PreferredAuthentications:权限认证(publickey、password publickey、keyboard-interactive),一般直接设为publickey
  • IdentityFile:私钥文件地址

现在就可以在VS Code中编写、保存和运行Ubuntu环境中的代码啦🎉

也可以在win环境的powershell中直接用ssh 用户名@Host连接

SSH 公钥认证原理

SSH 公钥认证是通过使用一对公钥和私钥来进行身份验证的过程。相比传统的基于密码的认证方式,公钥认证更加安全,因为它无需传输密码,而是依赖密钥对来进行身份验证。下面是 SSH 公钥认证的流程:

  1. 生成密钥对(客户端操作)

首先,在客户端生成一对 SSH 密钥对,包含一个公钥和一个私钥。

1
ssh-keygen -t rsa -b 2048
  • -t rsa:指定密钥类型为 RSA。
  • -b 2048:指定密钥的位数,2048 位是较为常用的安全标准。

生成密钥对时,系统会提示你选择密钥保存位置(默认是 ~/.ssh/id_rsa)以及是否为密钥设置密码保护(可以为空)。

  1. 将公钥复制到服务器(客户端操作)

生成密钥对后,需要将公钥传输到目标服务器。可以使用 ssh-copy-id 命令来自动完成这一过程,或者手动将公钥复制到服务器的授权密钥文件中。

  • 使用 ssh-copy-id 命令:
1
ssh-copy-id username@server_ip

该命令会将客户端的公钥(通常是 ~/.ssh/id_rsa.pub)复制到服务器的 ~/.ssh/authorized_keys 文件中。

  • 手动复制:

将公钥(~/.ssh/id_rsa.pub)的内容复制到服务器的 ~/.ssh/authorized_keys 文件中。可以通过 SSH 登录到服务器,然后执行以下操作:

1
2
3
4
mkdir -p ~/.ssh
cat id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
  1. 客户端发起 SSH 连接(客户端操作)

在配置好公钥后,当客户端尝试连接到服务器时,客户端会发起 SSH 连接请求。此时,客户端会向服务器发送一条包含自己的公钥的请求。

  1. 服务器验证公钥(服务器操作)

服务器接收到来自客户端的连接请求后,会检查客户端提供的公钥是否已经存在于 ~/.ssh/authorized_keys 文件中。如果存在,服务器会生成一个随机的挑战消息,并用客户端的公钥加密此消息。

  1. 客户端解密挑战消息(客户端操作)

客户端收到服务器的挑战消息后,会使用自己的私钥对其进行解密。因为只有客户端拥有正确的私钥,才能解密该消息。

  1. 客户端回应服务器(客户端操作)

客户端成功解密挑战消息后,会将解密后的消息返回给服务器作为响应。这证明了客户端拥有与公钥匹配的私钥。

  1. 服务器验证响应(服务器操作)

服务器收到客户端的响应后,使用客户端的公钥来验证响应。如果验证成功,说明客户端具有正确的私钥,身份认证通过,连接建立。

  1. 建立 SSH 会话

验证通过后,SSH 连接会建立,客户端可以与服务器进行安全的通信。

总结:

  1. 客户端生成公钥和私钥。
  2. 客户端将公钥复制到服务器。
  3. 客户端发起 SSH 连接请求。
  4. 服务器检查公钥并生成加密挑战。
  5. 客户端使用私钥解密挑战并回应。
  6. 服务器验证客户端的响应并建立安全连接。

通过这种方式,SSH 公钥认证提供了比密码更安全的身份验证机制,避免了密码泄露的风险。

参考

Built with Hugo
Theme Stack designed by Jimmy