前面提到,通过 Remote - SSH 插件,可以很容易地通过SSH连接到远程服务器,从VSCode直接打开远程服务器的目录和文件,进行开发。避免了一系列的 cd
和 vim
各种命令的切换,还可以有效地防止编辑时出错。
官方的SSH连接原理图:
下面讲讲具体的远程连接开发步骤。
本地机器配置
首先,确保本地机器已经包含 ~/.ssh
文件夹,如果没有,可以通过以下命令生成:
ssh-keygen
# or
ssh-keygen -t rsa -b 4096
参数解释:
-b 4096
表示生成的rsa秘钥对的长度是4096个bit-t
指定秘钥的签名算法,可选的算法有(dsa | ecdsa | ed25519 | rsa | rsa1)
生成完毕,终端提示:
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\quanzaiyu/.ssh/id_rsa):
Created directory 'C:\Users\quanzaiyu/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\quanzaiyu/.ssh/id_rsa.
Your public key has been saved in C:\Users\quanzaiyu/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:5RjNutFX+Kan0ZjUEZhAC/BaFAbIbRZlZnGi7biypmU quanzaiyu@DESKTOP-T1071CD
The key's randomart image is:
+---[RSA 2048]----+
| . o+=%++. o. |
| o +X * .o. . |
| o. = = . o |
| = B + . |
| o S o o + |
| . o o * |
| E . . = o |
| o.o + |
| .o. . |
+----[SHA256]-----+
然后转到自己的用户目录,可以看到一个 .ssh
文件夹,其中包括一个私钥和一个公钥:
远程机器配置
这里所说的远程机器,可以指虚拟机、云服务器等。下面以VMWare创建的虚拟机为例。
在远程机器中,同样需要生成秘钥:
ssh-keygen
然后转到.ssh文件夹,创建并修改 authorized_keys
文件:
[root@localhost ~]# cd .ssh
[root@localhost .ssh]# ls
id_rsa id_rsa.pub
[root@localhost .ssh]# vim authorized_keys
在里面添加上本地机器生成的公钥内容,也就是 id_rsa.pub
中的内容。
然后修改sshd的配置文件 /etc/ssh/sshd_config
,修改其中的 PubkeyAuthentication
配置项,将其启用,这样就可以通过SSH秘钥远程连接到本机器了 :
$ vim /etc/ssh/sshd_config
PubkeyAuthentication yes
然后重启sshd服务:
systemctl restart sshd
通过以下命令,查看sshd是否已经正常启动:
$ netstat -ntlp | grep ssh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 106277/sshd
tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 96880/sshd: root@pt
tcp6 0 0 :::22 :::* LISTEN 106277/sshd
tcp6 0 0 ::1:6011 :::* LISTEN 96880/sshd: root@pt
通过SSH连接进行远程开发
先通过Xshell尝试连接,发现已经可以正常连接了:
接下来就是配置VSCode了。首先确保已经安装以下插件:
在VSCode中找到这个面板,点击设置:
弹出一个选项框,config文件必须放到被授权的rsa秘钥所在的文件目录,也就是我们上面使用命令生成的.ssh文件夹,这里选择自己用户目录的那个即可:
在config中输入远程机器的配置,比如:
Host k8s-master
HostName 192.168.34.128
User root
Port 22
配置好之后,可以看到SSH Targets中多了一项远程机器的名称,点击后面的这个图标即可打开一个远程连接窗口。
第一次连接,会询问你远程机器的类型,选择对应的即可。
连接上后,会在远程机器中安装一些必要的程序。等待安装完毕。
待左下角字样变为远程机器的名称,说明已经完全连接上了。选择File->Open Folder
打开远程机器的目录:
远程终端
快捷键 `Ctrl + `` 打开内置终端,已经连接上远程服务器了:
这样就不需要在Xshell中来回切换了,非常方便。甚至可以将VSCode当成一个Xftp,直接将文件拖拽传输。
实际上,VSCode完全可以看做一个远程服务器UI,只不过不是桌面版,而是专门管理目录及文件的UI。
通过VSCode的内置终端,还可以使用 code 命令:
[root@localhost ~]# code --help
code 1.50.1
Usage: code [options][paths...]
To read from stdin, append '-' (e.g. 'ps aux | grep code | code -')
Options
-d --diff <file> <file> Compare two files with each other.
-a --add <folder> Add folder(s) to the last active window.
-g --goto <file:line[:character]> Open a file at the path on the specified line and character position.
-n --new-window Force to open a new window.
-r --reuse-window Force to open a file or folder in an already opened window.
--folder-uri <uri> Opens a window with given folder uri(s)
--file-uri <uri> Opens a window with given file uri(s)
-w --wait Wait for the files to be closed before returning.
-h --help Print usage.
Troubleshooting
-v --version Print version.
-s --status Print process usage and diagnostics information.
注意code命令只有通过VSCode的内置终端才能找到,通过Xshell连接的终端无法使用。
远程扩展管理
本地的扩展有些并不会直接应用于远程服务器,需要在远程服务器中进行安装。
安装非常方便,在本地扩展旁边会出现一个绿色的按钮,点击即可在远程服务器安装:
远程端口转发
这是一个超超超超级棒的功能,刚发现这个功能的时候,我都惊呆了。
这个功能非常有用,可以将远程服务器的端口直接转发到本地端口,通过本地IP或主机名访问。
比如,我们先看看远程服务器开了哪些Kubernetes相关的端口:
[root@localhost ~]# kubectl get no
NAME STATUS ROLES AGE VERSION
localhost.localdomain Ready master 3d3h v1.19.3
[root@localhost ~]# netstat -ntlp | grep kube
tcp 0 0 127.0.0.1:43847 0.0.0.0:* LISTEN 947/kubelet
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 947/kubelet
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 4215/kube-proxy
tcp 0 0 0.0.0.0:30443 0.0.0.0:* LISTEN 4215/kube-proxy
tcp 0 0 0.0.0.0:31979 0.0.0.0:* LISTEN 4215/kube-proxy
tcp 0 0 127.0.0.1:10257 0.0.0.0:* LISTEN 3443/kube-controlle
tcp 0 0 127.0.0.1:10259 0.0.0.0:* LISTEN 3459/kube-scheduler
tcp 0 0 0.0.0.0:31157 0.0.0.0:* LISTEN 4215/kube-proxy
tcp6 0 0 :::10250 :::* LISTEN 947/kubelet
tcp6 0 0 :::6443 :::* LISTEN 3483/kube-apiserver
tcp6 0 0 :::10256 :::* LISTEN 4215/kube-proxy
假设我们想要将远程服务器的30443端口映射到本地的1443,只需要在VSCode找到对应端口,点击“+”即可:
测试端口映射是否正常工作,在浏览器中输入:
远程地址:
本地地址:
That’s fantastic, amazing!
启动时映射端口
如果想要在打开远程窗口时就将端口映射到本地,而不是手动去设置,可以使用此功能。
只需要在config中添加 LocalForward
即可:
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host k8s-master
HostName 192.168.34.128
User root
Port 22
LocalForward 127.0.0.1:1443 127.0.0.1:30443
其中前面一项指本地IP及端口,后面一项指远程IP及端口。
上面的配置表示,将远程端口的30443映射到本地的1443端口。