开启成长之旅!这是我参加「日新计划 2 月更文应战」的第 21 天,点击检查活动概况。

SSH 概述

SSH安全外壳协议 Secure Shell Protocol,简称SSH)是一种加密的网络传输协议,用于在网络中完结客户端和服务端的衔接,典型的如咱们在本地电脑经过 SSH衔接长途服务器,从而做开发,Windows、macOS、Linux都有自带的 SSH 客户端,但是在Windows上使用 SSH 客户端的体会并不是很好,所以咱们一般使用 Xshell 来替代。

一,准备工作

1.1, 安装 SSH 客户端

为了建立 SSH 长途衔接,需求两个组件:客户端和相应服务端组件,SSH 客户端是咱们安装在本地电脑的软件;而服务端,也需有一个称为 SSH 看护程序的组件,它不断地侦听特定的 TCP/IP 端口以获取或许的客户端衔接请求。 一旦客户端发起衔接,SSH 看护进程将以软件和它支撑的协议版别作为响应,两者将交流它们的标识数据。假如供给的凭证正确,SSH 会为适当的环境创立一个新会话。

MacOS 体系自带 SSH 客户端,能够直接使用,Windows 体系需求安装 Xshell 客户端软件,大部分 Linux 发行版体系都自带 SSH 客户端,能够直接使用,可经过 ssh -V 指令检查当前体系是否有 SSH 客户端。

[root@VM-0-2-centos ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

1.2, 安装 SSH 服务端

Linux 体系检查 ssh 服务端是否可用的指令有好几种,比如直接看是否有 ssh 进程在运转:

ps -ef | grep ssh

运转以上后,输出成果示例如下,有 sshd 进程在运转,阐明 ssh 服务端可用。

-bash-4.3$ ps -e|grep ssh
  336 ?        00:00:00 sshd
  358 ?        00:00:00 sshd
 1202 ?        00:00:00 sshd
 1978 ?        00:00:00 sshd
 1980 ?        00:00:00 sshd
 2710 ?        00:00:00 sshd
 2744 ?        00:00:00 sshd
 2829 ?        00:00:00 sshd
 2831 ?        00:00:00 sshd
 9864 ?        00:00:00 sshd
 9893 ?        00:00:02 sshd

关于 Ubuntu 体系,可经过以下指令检查 OpenSSH 服务端软件是否可用:

ssh localhost # 不同 Linux 体系输出或许不一样

二,根据暗码的登录衔接

典型用法,只需输入以下指令即可衔接长途服务器。

# ssh衔接默许端口是22,假如本地机用户名和长途机用户名共同,能够省掉用户名
ssh username@host
# 也能够指定衔接端口
ssh -p port user@host

上述指令是典型的 SSH 衔接长途服务器的指令,假如是第一次衔接运转后会得到以下提示,正常输入 yes,然后输入账号暗码即可衔接成功:

The authenticity of host '81.69.58.141 (81.69.58.141)' can't be established.
ED25519 key fingerprint is SHA256:QW5nscbIadeqedp7ByOSUF+Z45rxWGYJvAs3TTmTb0M.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Last login: Tue Feb 28 15:33:06 2023 from xx.xx.xx.xx

三,根据公钥登录衔接

前面的指令是经过暗码(私钥)登录,这样比较麻烦,因为每次登录咱们都需求输入暗码,因而咱们能够选择 SSH 的公钥登录衔接方法,省去输入暗码的过程。

公钥登录的原理,是先在本地机器上生成一对公钥和私钥,然后手动把公钥上传到长途服务器。这样每次登录时,长途主机会向用户发送一段随机字符串,而用户会用自己的私钥对这段随机字符串进行加密,然后把加密后的字符串发送给长途主机,长途主机会用用户的公钥对这段字符串进行解密,假如解密后的字符串和长途主机发送的随机字符串共同,那么就认为用户是合法的,答应登录。 只需求把私钥传给长途服务器,长途服务器就能够验证私钥是否是对应的公钥,假如是就答应登录,这样就不需求输入暗码了。

SSH 支撑多种用于身份验证密钥的公钥算法, 包括 RSA、DSA、ECDSA 和 ED25519 等,其中 RSA 算法是最常用的,因为它是 SSH 协议的默许算法,所以咱们这儿以 RSA 算法为例来生成密钥,并装备免暗码长途衔接。

ssh-keygen 是为 SSH 创立新的身份验证密钥对的工具。此类密钥对用于自动登录、单点登录和验证主机,常用参数定义如下:

  • -t 参数指定密钥类型
  • -b 参数指定密钥长度

根据公钥登录衔接的具体过程如下:

1,本地终端运转 ssh-keygen -t rsa -b 4096 指令生成密钥对,运转后会提示输入密钥保存途径,直接回车即可,保存在默许途径下,然后会提示输入密钥暗码,这儿咱们不设置暗码,直接回车即可,然后会提示再次输入暗码,这儿也不设置暗码,直接回车即可,最后会提示密钥生成成功,如下图所示,能够看出 ~/.ssh/ 目录下,会新生成两个文件:id_rsa.pubid_rsa,分别是公钥和私钥文件。

ssh远程连接方式总结

2,将本地 .ssh 目录下的 id_rsa.pub 文件内容添加到方针服务器的 ~/.ssh/authorized_keys 文件中,假如方针服务器没有 .ssh 目录,需求先创立 .ssh 目录,然后再创立 authorized_keys 文件,然后再添加文件内容。

具体操作指令如下:

# 1,本地终端运转指令
cat ~/.ssh/id_rsa.pub  # 检查本地公钥文件内容,并复制
# 2,长途终端运转指令,有 authorized_keys 文件则越过
mkdir -p ~/.ssh  # 创立 .ssh 目录
touch ~/.ssh/authorized_keys  # 创立 authorized_keys 文件
# 3,然后将本地公钥文件内容粘贴到 `authorized_keys` 文件中,保存退出

假如觉得上述过程过分繁琐,可经过下面指令,一键完结公钥登录衔接的装备:

$ ssh username@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub

只要将公钥文件内容写入长途服务器的 authorized_keys 的文件,公钥登录的设置就完结了,后续长途衔接就不必每次输入暗码了!

Github 提交代码的时分,也是经过公钥登录衔接的方法,只要将本地的公钥文件内容添加到 github 的 authorized_keys 文件中,就能够免暗码提交代码了,原理是如出一辙的。

四,VSCode 长途衔接

VSCode 也支撑长途衔接,能够经过 Remote-SSH 插件来完结,具体操作过程如下:

1,在 VSCode 中安装 Remote-SSH 插件。

2,windows 体系 ctrel + shift + p 指令翻开指令面板,输入 Remote-SSH: Connect to Host...,然后选择 SSH Configuration,或者经过左边菜单栏的 Remote Explorer -> SSH Targets -> SSH Configuration 进入。如下图所示:

ssh远程连接方式总结

3,然后会翻开 ~/.ssh/config 装备文件,能够参阅如下所示模板进行装备:

# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host JumpMachine
    HostName jump-vscode.sensetime.com
    # 你跳板机的用户名
    User username
Host T4
    # 方针机的ip地址
    HostName xxx.xxx.xxx.xxx
    # 你方针机的用户名
    User username
    # 方针机登录端口
    Port 22
    # macos体系: ProxyCommand ssh -q -W %h:%p JumpMachine
    ProxyCommand ssh -q -W %h:%p JumpMachine

4,本地机生产公钥并追加到长途服务器 authorized_keys 中的过程,参阅第三章。

5,装备完结后,保存退出,然后在 VSCode 中,点击左边菜单栏的 Remote Explorer -> SSH Targets -> T4,即可衔接到长途服务器。

参阅资料

  1. 维基百科-Secure Shell
  2. How to Use ssh-keygen to Generate a New SSH Key?
  3. SSH原理与运用(一):长途登录