前言
在虚拟机中使用VSCode编程时时常卡死,查阅资料后发现有许多人遇到此问题,原因可能是VSCode的默认GPU加速问题,需要修改配置文件关闭。由于我在宿主机使用VSCode不卡顿,遂考虑将前端放置宿主机开发,但又会产生宿主机与虚拟机中项目文件不一致,需要时常来回拷贝覆盖的问题,突然看到有使用SSH实现VSCode远端互联的方法,恰好可以解决我的问题,特此记录。
环境
- Windows 11 专业版
- VMware 17 pro
- Ubuntu 22.04.2
- VSCode 1.85.1
配置
口令登录
服务端
- 在Ubuntu上安装SSH服务器。打开终端,并依次运行以下命令来安装OpenSSH服务器,并启动SSH服务器:
|
|
客户端
- 打开Windows上的VS Code,安装“Remote - SSH”扩展。
- 打开VSCode侧边栏的远程资源管理器,右键SSH,选择配置SSH文件
- 在文件中输入远端的IP和用户名,再定义该连接的名称即可
在该配置文件中可以配置多个Linux服务器信息
- 重新打开VSCode侧边栏的远程资源管理器即可,连接成功后,VS Code会打开一个新的窗口,显示Ubuntu上的文件系统(可以使用“文件”>“打开文件夹”浏览和打开远端目录中的文件夹)
Windows环境中需要提前安装有OpenSSH
- 在宿主机VSCode中修改文件后,打开虚拟机可以看到对应文件也同步修改成功。
注意两端的插件是不互通的,需要按照需要自己下载安装
- 打开终端也可以看到是远端的终端
如果要结束 SSH 连接,可以使用“文件”>“关闭远程连接”返回到在本地运行 VS Code。
免密登录
客户端
- 生成公私钥对
|
|
- 将公钥复制到远程主机的
~/.ssh/authorized_key
文件中
|
|
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" } }
- 配置
~/.ssh/config
文件,
|
|
PreferredAuthentications
:权限认证(publickey、password publickey、keyboard-interactive),一般直接设为publickey
IdentityFile
:私钥文件地址
现在就可以在VS Code中编写、保存和运行Ubuntu环境中的代码啦🎉
也可以在win环境的powershell中直接用ssh 用户名@Host
连接
SSH 公钥认证原理
SSH 公钥认证是通过使用一对公钥和私钥来进行身份验证的过程。相比传统的基于密码的认证方式,公钥认证更加安全,因为它无需传输密码,而是依赖密钥对来进行身份验证。下面是 SSH 公钥认证的流程:
- 生成密钥对(客户端操作)
首先,在客户端生成一对 SSH 密钥对,包含一个公钥和一个私钥。
|
|
-t rsa
:指定密钥类型为 RSA。-b 2048
:指定密钥的位数,2048 位是较为常用的安全标准。
生成密钥对时,系统会提示你选择密钥保存位置(默认是 ~/.ssh/id_rsa
)以及是否为密钥设置密码保护(可以为空)。
- 将公钥复制到服务器(客户端操作)
生成密钥对后,需要将公钥传输到目标服务器。可以使用 ssh-copy-id
命令来自动完成这一过程,或者手动将公钥复制到服务器的授权密钥文件中。
- 使用
ssh-copy-id
命令:
|
|
该命令会将客户端的公钥(通常是 ~/.ssh/id_rsa.pub
)复制到服务器的 ~/.ssh/authorized_keys
文件中。
- 手动复制:
将公钥(~/.ssh/id_rsa.pub
)的内容复制到服务器的 ~/.ssh/authorized_keys
文件中。可以通过 SSH 登录到服务器,然后执行以下操作:
|
|
- 客户端发起 SSH 连接(客户端操作)
在配置好公钥后,当客户端尝试连接到服务器时,客户端会发起 SSH 连接请求。此时,客户端会向服务器发送一条包含自己的公钥的请求。
- 服务器验证公钥(服务器操作)
服务器接收到来自客户端的连接请求后,会检查客户端提供的公钥是否已经存在于 ~/.ssh/authorized_keys
文件中。如果存在,服务器会生成一个随机的挑战消息,并用客户端的公钥加密此消息。
- 客户端解密挑战消息(客户端操作)
客户端收到服务器的挑战消息后,会使用自己的私钥对其进行解密。因为只有客户端拥有正确的私钥,才能解密该消息。
- 客户端回应服务器(客户端操作)
客户端成功解密挑战消息后,会将解密后的消息返回给服务器作为响应。这证明了客户端拥有与公钥匹配的私钥。
- 服务器验证响应(服务器操作)
服务器收到客户端的响应后,使用客户端的公钥来验证响应。如果验证成功,说明客户端具有正确的私钥,身份认证通过,连接建立。
- 建立 SSH 会话
验证通过后,SSH 连接会建立,客户端可以与服务器进行安全的通信。
总结:
- 客户端生成公钥和私钥。
- 客户端将公钥复制到服务器。
- 客户端发起 SSH 连接请求。
- 服务器检查公钥并生成加密挑战。
- 客户端使用私钥解密挑战并回应。
- 服务器验证客户端的响应并建立安全连接。
通过这种方式,SSH 公钥认证提供了比密码更安全的身份验证机制,避免了密码泄露的风险。
参考