一、什么是 SSH?

SSH(Secure Shell) 是一种协议,用于在不受信任的网络传输上,进行两个计算机之间安全的数据交换。SSH 保证了身份、数据、文件的私密性完整性。它在 UNIX、Linux 和 macOS 机器上是标配的,并在全球 90% 以上的数据中心中使用。 :::info SSH 是 TCP 协议的上层协议。RFC 4251 指定 SSH 传输层协议也可以是其他任何可靠的数据流。
SSH 协议的默认监听端口是 22。 :::

SSH 协议的实现:OpenSSH(开源版)、商用版

1. SSH 工作原理

  1. 保证私密性:非对称加密
    1. 数据发送方:明文 ——> 公钥 ——> 密文
    2. 数据接收方:密文 ——> 公钥 ——> 明文

      非对称加密算法:DSA、RSA、ECDSA、ED25519……

image.png

  1. 保证完整性:哈希算法
    1. 数据发送方:明文 + hash(对明文进行哈希运算) ——> 公钥 ——> 密文
    2. 数据接收方:密文 ——> 公钥 ——> 明文 + hash
      1. 将明文 hash 运算后,与 hash 值对比

        国密算法中,能够提供数据完整性的算法主要是:SM3。 国际算法中,能够提供数据完整性的算法主要是:MD5、SHA256、SHA512。

Remote-SSH - 图2

  1. SSH client 连接 SSH server
  2. SSH server 将其公钥指纹发送给 SSH Client
    1. 公钥指纹:由于 SSH Server 的 RSA 公钥太长,对比麻烦,用哈希算法运算后短很多,对比方便。
  3. Client 和 Server 协商参数,并打开安全通道
  4. Client 登陆 Server 的操作系统

    2. SSH 应用

    SSH 主要应用在远程登陆、远程控制上。

    3. Windows 如何安装 SSH

  5. Windows 安装 git 之后,就自带了 SSH。

  6. 《基于Windows 的 OpenSSH安装与配置》

    二、使用案例

    2.1 密码登陆

    假如现在有一台服务器,域名是 konsoue.com,端口是 35000。其操作系统的用户名是 root
    1. ssh -p 35000 root@konsoue.com
    首次连接,不能直接建立连接,SSH server 返回公钥指纹
    1. The authenticity of host '[konsoue.com]:35000' can't be established.
    2. ECDSA key fingerprint is SHA256:w19fMK505zQZ//p52tCY938UWt123456TjUc83NVWRw.
    1. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    2. Warning: Permanently added '[konsoue.com]:35000' (ECDSA) to the list of known hosts.
    3. Connection reset by konsoue.com port 35000
    :::info known_hosts 是保存了本机用户所信赖的远程主机的公钥。
    linux 系统中,通常存在 etc/ssh/ssh_known_hosts
    window 系统中,通常存在 C:\Users\<用户名>\.ssh\known_hosts ::: 接着会要求输入密码。
    1. Password:(enter password)

    2.2 公钥登陆

    使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。 :::info 所谓”公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录 shell,不再要求密码。 ::: Github 仓库,可以让我们存储自己电脑的 SSH 公钥到远程主机(Github 服务器)。
    所以在我们本地电脑,需要先生成公钥。
    1. ssh-keygen -t rsa -C 'konsoue@qq.com'
    :::info linux 系统中,存在 etc/ssh
    window 系统中,存在 C:\Users\<用户名>\.ssh ::: 我们把生成的 id_rsa.pub 公钥,存到 Github 中就可以了。
    如果我们是 Linux 电脑,要连接远程电脑/服务器,可以使用如下命令,设置 公钥 到 SSH server,然后从此就可以不用密码登陆了。
    1. ssh-copy-id root@konsoue.com
    如果还是不行,就打开远程主机的 /etc/ssh/sshd_config这个文件,检查下面几行前面#注释是否取掉。
    修改后,重启远程主机的 ssh 服务。
    1. RSAAuthentication yes
    2. PubkeyAuthentication yes
    3. AuthorizedKeysFile .ssh/authorized_keys
    如果我们是 Windows 电脑,由于没有 ssh-copy-id 的命令,需要用 powershell 来模拟。
    1. type C:\Users\<用户名>\.ssh\id_rsa.pub | ssh -p 35000 root@konsoue.com "cat >> .ssh/authorized_keys"

    可以打开window 的 cmd,用 ssh 连接远程主机,如果不需要输入密码,证明成功了。

三、Remote-SSH

Remote-SSH 扩展可以让我们在 VSCode 上,通过 SSH 连接 SSH Server(远程服务器/虚拟机/容器)。当建立连接之后。我们就可以在 VSCode 上任意操作远程电脑的文件或文件夹。

3.1 基本原理

Remote-SSH - 图3

  1. 本地使用 SSH 连接 Remote Machine/ VM
  2. Remote Machine/ VM 使用 VS Code Server 管理文件。

    Remote Machine / VM 安装 VS Code Server 教程

3.2 如何使用

  1. 在商店安装扩展

image.png

  1. 侧边栏出现一个小电脑

2022.06.29_10.29.33.jpg

  1. 先保证你在 cmd 中,用 ssh 命令行能连接上你的 SSH Server。
  2. 点击设置按钮

image.png

  1. 选择配置文件,如选择第一个

image.png

  1. 配置 config 文件

image.png

Host 是会在左边展示的 Remote Server 的名称。 HostName 是 Remote Server 的 域名/ip User 是以哪个角色身份访问 Remote Server Port 是端口

  1. 右键点击 DevCloud,即 SSH Server

选择在当前的 VSCode 连接,还是另开一个 VSCode。
image.png

  1. 打开文件,会连接到 SSH Server 的文件系统,你就可以选择了

image.png :::warning 如果事先没有使用 SSH 的公钥登陆 SSH Server,那么需要用密码登陆。
此时,会自动打开终端,要求你输入密码。该密码是你的服务器登陆的密码。 :::

参考资料

《SSH Server》
《How Does SSH Protocol Work?》
《Remote Development using SSH》
《Windows 10 OpenSSH Equivalent of ssh-copy-id》
《SSH原理与运用(一):远程登录》