前面提到,通过 Remote - SSH 插件,可以很容易地通过SSH连接到远程服务器,从VSCode直接打开远程服务器的目录和文件,进行开发。避免了一系列的 cdvim 各种命令的切换,还可以有效地防止编辑时出错。

官方的SSH连接原理图:
architecture-ssh.png

下面讲讲具体的远程连接开发步骤。

本地机器配置

首先,确保本地机器已经包含 ~/.ssh 文件夹,如果没有,可以通过以下命令生成:

  1. ssh-keygen
  2. # or
  3. ssh-keygen -t rsa -b 4096

参数解释:

  • -b 4096 表示生成的rsa秘钥对的长度是4096个bit
  • -t 指定秘钥的签名算法,可选的算法有(dsa | ecdsa | ed25519 | rsa | rsa1)

生成完毕,终端提示:

  1. Generating public/private rsa key pair.
  2. Enter file in which to save the key (C:\Users\quanzaiyu/.ssh/id_rsa):
  3. Created directory 'C:\Users\quanzaiyu/.ssh'.
  4. Enter passphrase (empty for no passphrase):
  5. Enter same passphrase again:
  6. Your identification has been saved in C:\Users\quanzaiyu/.ssh/id_rsa.
  7. Your public key has been saved in C:\Users\quanzaiyu/.ssh/id_rsa.pub.
  8. The key fingerprint is:
  9. SHA256:5RjNutFX+Kan0ZjUEZhAC/BaFAbIbRZlZnGi7biypmU quanzaiyu@DESKTOP-T1071CD
  10. The key's randomart image is:
  11. +---[RSA 2048]----+
  12. | . o+=%++. o. |
  13. | o +X * .o. . |
  14. | o. = = . o |
  15. | = B + . |
  16. | o S o o + |
  17. | . o o * |
  18. | E . . = o |
  19. | o.o + |
  20. | .o. . |
  21. +----[SHA256]-----+

然后转到自己的用户目录,可以看到一个 .ssh 文件夹,其中包括一个私钥和一个公钥:
image.png

远程机器配置

这里所说的远程机器,可以指虚拟机、云服务器等。下面以VMWare创建的虚拟机为例。

在远程机器中,同样需要生成秘钥:

  1. ssh-keygen

然后转到.ssh文件夹,创建并修改 authorized_keys 文件:

  1. [root@localhost ~]# cd .ssh
  2. [root@localhost .ssh]# ls
  3. id_rsa id_rsa.pub
  4. [root@localhost .ssh]# vim authorized_keys

在里面添加上本地机器生成的公钥内容,也就是 id_rsa.pub 中的内容。
image.png
然后修改sshd的配置文件 /etc/ssh/sshd_config ,修改其中的 PubkeyAuthentication 配置项,将其启用,这样就可以通过SSH秘钥远程连接到本机器了 :

  1. $ vim /etc/ssh/sshd_config
  2. PubkeyAuthentication yes

然后重启sshd服务:

  1. systemctl restart sshd

通过以下命令,查看sshd是否已经正常启动:

  1. $ netstat -ntlp | grep ssh
  2. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 106277/sshd
  3. tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 96880/sshd: root@pt
  4. tcp6 0 0 :::22 :::* LISTEN 106277/sshd
  5. tcp6 0 0 ::1:6011 :::* LISTEN 96880/sshd: root@pt

通过SSH连接进行远程开发

先通过Xshell尝试连接,发现已经可以正常连接了:
image.png

接下来就是配置VSCode了。首先确保已经安装以下插件:
📃 通过Remote - SSH进行远程开发 - 图5

在VSCode中找到这个面板,点击设置:
image.png
弹出一个选项框,config文件必须放到被授权的rsa秘钥所在的文件目录,也就是我们上面使用命令生成的.ssh文件夹,这里选择自己用户目录的那个即可:
image.png
在config中输入远程机器的配置,比如:

  1. Host k8s-master
  2. HostName 192.168.34.128
  3. User root
  4. Port 22

配置好之后,可以看到SSH Targets中多了一项远程机器的名称,点击后面的这个图标即可打开一个远程连接窗口。
image.png
第一次连接,会询问你远程机器的类型,选择对应的即可。
image.png
连接上后,会在远程机器中安装一些必要的程序。等待安装完毕。

待左下角字样变为远程机器的名称,说明已经完全连接上了。选择File->Open Folder 打开远程机器的目录:
image.png

远程终端

快捷键 `Ctrl + `` 打开内置终端,已经连接上远程服务器了:
image.png

这样就不需要在Xshell中来回切换了,非常方便。甚至可以将VSCode当成一个Xftp,直接将文件拖拽传输。

实际上,VSCode完全可以看做一个远程服务器UI,只不过不是桌面版,而是专门管理目录及文件的UI。

通过VSCode的内置终端,还可以使用 code 命令:

  1. [root@localhost ~]# code --help
  2. code 1.50.1
  3. Usage: code [options][paths...]
  4. To read from stdin, append '-' (e.g. 'ps aux | grep code | code -')
  5. Options
  6. -d --diff <file> <file> Compare two files with each other.
  7. -a --add <folder> Add folder(s) to the last active window.
  8. -g --goto <file:line[:character]> Open a file at the path on the specified line and character position.
  9. -n --new-window Force to open a new window.
  10. -r --reuse-window Force to open a file or folder in an already opened window.
  11. --folder-uri <uri> Opens a window with given folder uri(s)
  12. --file-uri <uri> Opens a window with given file uri(s)
  13. -w --wait Wait for the files to be closed before returning.
  14. -h --help Print usage.
  15. Troubleshooting
  16. -v --version Print version.
  17. -s --status Print process usage and diagnostics information.

注意code命令只有通过VSCode的内置终端才能找到,通过Xshell连接的终端无法使用。

远程扩展管理

本地的扩展有些并不会直接应用于远程服务器,需要在远程服务器中进行安装。

安装非常方便,在本地扩展旁边会出现一个绿色的按钮,点击即可在远程服务器安装:
image.png

远程端口转发

这是一个超超超超级棒的功能,刚发现这个功能的时候,我都惊呆了。

这个功能非常有用,可以将远程服务器的端口直接转发到本地端口,通过本地IP或主机名访问。

比如,我们先看看远程服务器开了哪些Kubernetes相关的端口:

  1. [root@localhost ~]# kubectl get no
  2. NAME STATUS ROLES AGE VERSION
  3. localhost.localdomain Ready master 3d3h v1.19.3
  4. [root@localhost ~]# netstat -ntlp | grep kube
  5. tcp 0 0 127.0.0.1:43847 0.0.0.0:* LISTEN 947/kubelet
  6. tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 947/kubelet
  7. tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 4215/kube-proxy
  8. tcp 0 0 0.0.0.0:30443 0.0.0.0:* LISTEN 4215/kube-proxy
  9. tcp 0 0 0.0.0.0:31979 0.0.0.0:* LISTEN 4215/kube-proxy
  10. tcp 0 0 127.0.0.1:10257 0.0.0.0:* LISTEN 3443/kube-controlle
  11. tcp 0 0 127.0.0.1:10259 0.0.0.0:* LISTEN 3459/kube-scheduler
  12. tcp 0 0 0.0.0.0:31157 0.0.0.0:* LISTEN 4215/kube-proxy
  13. tcp6 0 0 :::10250 :::* LISTEN 947/kubelet
  14. tcp6 0 0 :::6443 :::* LISTEN 3483/kube-apiserver
  15. tcp6 0 0 :::10256 :::* LISTEN 4215/kube-proxy

假设我们想要将远程服务器的30443端口映射到本地的1443,只需要在VSCode找到对应端口,点击“+”即可:
image.png

测试端口映射是否正常工作,在浏览器中输入:

远程地址:
image.png
本地地址:
image.png

That’s fantastic, amazing!

启动时映射端口

如果想要在打开远程窗口时就将端口映射到本地,而不是手动去设置,可以使用此功能。

只需要在config中添加 LocalForward 即可:

  1. # Read more about SSH config files: https://linux.die.net/man/5/ssh_config
  2. Host k8s-master
  3. HostName 192.168.34.128
  4. User root
  5. Port 22
  6. LocalForward 127.0.0.1:1443 127.0.0.1:30443

其中前面一项指本地IP及端口,后面一项指远程IP及端口。

上面的配置表示,将远程端口的30443映射到本地的1443端口。

参考资料