ssh 的简单运用

268 阅读5分钟

ssh 的简单运用 🌼

本文是我在项目部署之后的总结笔记 ✍,记录了 SSH 的简单运用

什么是 SSH?

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 最初是 UNIX 系统上的一个程序,后来又迅速扩展到其他操作平台。SSH 在正确使用时可弥补网络中的漏洞。SSH 客户端适用于多种平台。几乎所有 UNIX 平台—包括 HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行 SSH。(百度百科)

其实就是端到端的一种加密的网络传输协议,一般用于linux。

SSH 的俩种连接方式

密码登录

$ ssh user@host -p
# user 远程服务器的用户
# host 远程服务器的主机名或者IP地址

第一次登录会出现下面提示 👇:

  The authenticity of host 'host (xx.xx.xx.xx))' can't be established.
  RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
  Are you sure you want to continue connecting (yes/no)?

上面的意思是,无法确认 host 主机的真实性,只知道它的公钥指纹,你确定要继续连接吗?

公钥指纹:公钥一般都比较长(采用 RSA 算法,长达 1024 位),比较难对比,所以对其进行了 MD5 或者 SHA256 计算,将它变成一个 128 位的指纹(上面是 16 进制表示),再进行比较,就相对简单了一些

那如何对比呢?答案是没有好办法,需要自己去远程服务器上通过以下命令确认 👇

$ ssh-keygen -lf ~/.ssh/id_rsa.pub

较新的 SSH 命令会将指纹列为SHA256密钥
如果需要将其与旧指纹进行比较,还需要指定使用 MD5 指纹散列函数。

ssh-keygen -E md5 -lf ~/.ssh/id_dsa.pub

经过确认以后,决定接受这个远程主机的公钥。

Are you sure you want to continue connecting (yes/no)? yes

shell 紧接着会出现以下提示,表示 host 主机已经得到认可。

Warning: Permanently added 'host,xx.xx.xx.xx' (RSA) to the list of known hosts.

紧接着会让你输入密码(远程服务器登录密码)

Password: (enter password)

密码正确即会登录成功
初次登录成功后,远程 host 的公钥就会被保存在文件~/.ssh/known_hosts 中,下次在连接这台 host,系统会自动识别到这台公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码

免密登录

每次登录都需要输入密码,非常麻烦,所以就需要换一种方式登录->免密登录

免密登录原理:就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录 shell,不再要求密码。

这时候就需要通过ssh-keygen生成秘钥对 👇:

ssh-keygen -t rsa -f ~/.ssh/id_rsa -C xxx
# -t: 密钥类型, 可以选择 dsa | ecdsa | ed25519 | rsa; 省略的情况下默认是rsa
# -f: 密钥目录位置,指定生成密钥的保存路径和文件名。省略的情况下, 默认为当前用户home路径下的.ssh隐藏目录, 也就是~/.ssh/, 同时默认密钥文件名以id_rsa开头.
# -C: 指定此密钥的备注信息, 需要配置多个免密登录时, 建议携带;生成的公钥会在最后面显示此备注信息

运行结束后,在~/.ssh/目录下,会新生成俩个文件:id_rsa.pub 和 id_rsa。前者是公钥,后者是私钥。
备注:在未指定私钥时,id_rsa 私钥是连接任意 host 时使用的私钥(/etc/ssh/ssh_config)

接着需要将公钥添加到远程 host 的~/.ssh/authorized_keys 文件中

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

后续就可以直接进行 ssh 免密登录了

私钥太多怎么办?

场景:当你的电脑需要经常 ssh 不同的服务器时,不同的服务器需要不同的私钥来连接,这时候你就需要在连接时指定私钥,这样比较麻烦

使用ssh-agent

ssh-agent 是一种控制用来保存公钥身份验证所使用的私钥的程序,其实 ssh-agent 就是一个密钥管理器,运行 ssh-agent 以后,使用 ssh-add 将私钥交给 ssh-agent 保管,其他程序需要身份验证的时候可以将验证申请交给 ssh-agent 来完成整个认证过程。
备注:在我使用的过程中,ssh-agent 在会话结束(shell 关闭)就停止了,每次都需要 ssh-agent bash 启动,然后通过 ssh-add xxx 添加私钥
可以通过 ssh-add -l 查看缓存区内的私钥(秘钥指纹显示),不会显示默认秘钥

参考文章:zhuanlan.zhihu.com/p/126117538

创建配置文件

在~/.ssh/目录下创建 config 文件,例如:

Host git

    HostName github.com

    Port 22

    User git

    IdentityFile ~/xxxx #私钥的路径

这样以后连接就可以通过以下命令

   ssh -T git
   # -T:测试连接

大白话理解公钥 🔓 和私钥 🔑

公钥就是锁,私钥就是钥匙,当你拿到这套装备时,首先需要将锁安装到门上(authorized_keys),然后通过钥匙(私钥)来解锁,由于有家人,所以家人也会有钥匙(私钥),又因为家里面锁很多,需要不同的钥匙来解锁,钥匙多了不容易记住,所以可以给钥匙上面贴个条 📄 标注哪个锁(利用配置文件快速连接)。
备注:这套锁和钥匙不仅仅可以用在一个地方(copy),只要是能上锁的地方都能用(一对秘钥对可以在多个地方使用)

git clone 俩种方式的区别

HTTPS:不管是谁,拿到 url 随便 clone,但是在 push 的时候需要验证用户名和密码。
SSH:clone 的项目你必须是拥有者或者管理员,而且需要在 clone 前添加 SSH Key。SSH 在 push 的时候,是不需要输入用户名的,如果配置 SSH key 的时候设置了密码(passparse),则需要输入密码的,否则直接是不需要输入密码的。

备注 ❗

~ :当前用户的根目录
普通用户一般在/home/xxx
root 的根目录在/root

passparse :私钥的密码。如果担心私钥的安全,可以在生成秘钥对的时候设置,就会加密私钥,在使用私钥时都会让你输入 passparse 来解密。

/etc/ssh/ssh_config:全局的 ssh客户端配置文件。里面是默认配置,指定了~/.ssh/id_rsa 为默认私钥,还有很多配置有待发掘...