经常需要接触
Linux,就无可避免需要进行通信,不管是可视化客户端软件,还是直接使用命令行SSH命令,其背后通信原理大多都是走的SSH协议,关于SSH相关知识,可参考最下面连接,这里做一些常用总结。
声明
针对下面需要用到的一些值,做一些示例声明:
- 服务器操作系统:
CentOS 7 - IP:
192.168.1.100 - User:
root - Password:
123456789
实际操作,请把上面信息替换成自己的。
SSH 普通登录
使用命令行登录时,通常是ssh root@192.168.1.100 ,这时会提示以下内容:
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:Cuogx2RbYbaYdCNhloFVudgjfCVsEZUhOnTFwhJ+Dh8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
注意:上面的提示,只有在你 第一次 像该服务器连接时才会提示,并且,如果这里你输入
no,那么下次依然会提示,如果这次输入yes,那么以后将不会再提示。(哪怕你接下来密码输入错误没有登录成功)
输入 no 会退出;
输入 yes 会进入到输入密码提示,如下:
......
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.100' (ED25519) to the list of known hosts.
root@192.168.1.100's password:
这个时候会提示让你输入密码,暂且先不说密码,先看看第二句:
- 原文:
Warning: Permanently added '192.168.1.100' (ED25519) to the list of known hosts. - 百度翻译一下:
警告:已将“192.168.1.100”(ED25519)永久添加到已知主机列表中。
前面提到,如果输入yes,以后便不会再提示,就是这句话起的作用,这句话背后做了什么呢?
再执行:cat ~/.ssh/known_hosts | grep '192.168.1.100',输出如下:
192.168.1.100 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKrl7c+eaBxma6Bx9O+p6KmdBwHak8cedikgu1NRuKpU
好了,这里又牵扯出一个文件~/.ssh/known_hosts,简单讲,这个文件的作用就是,本机每次向一个新的服务器发出连接请求时,经过你自己确认(输入yes)后,就会在这个文件中保留一个服务器指纹,用来记住你跟这个服务器的通信。
加入服务器重装了系统,或者重装了 SSH 服务,这个时候你再次 ssh root@192.168.1.100,便会提示:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
77:a5:69:81:9b:eb:40:76:7b:13:04:a9:6c:f4:9c:5d.
Please contact your system administrator.
.......
......
这个时候,解决这个问题的方式有三种:
- 删除
~/.ssh/known_hosts文件,网上很多帖子都是这么说的,也是最粗暴最不提倡的; - 手工打开
~/.ssh/known_hosts文件,找到跟你要连接的IP,例如本文中192.168.1.100相关的行,删除掉; - 执行
ssh-keygen -R 192.168.1.100,该命令会自动帮你干第二条中的事,多好多棒多省事~
然后再次 ssh root@192.168.1.100 时,便又回到了本文最初的地方。
SSH 免密码登录
在客户端与服务器端登录时,也可以不用密码哦,就像浏览器记住密码一样,但和浏览器不一样的是,浏览器是记住了密码,在浏览器中还可以找到密码,更合适的比喻,应该更像是一些
OpenAPI中提供的Token令牌等机制,不用使用账号密码而是通过Token便可以获取数据,可以更有效的管理授权凭证。
SSH 免密码的前提是需要一对秘钥对,常见操作,如我们经常使用的GitHub服务,常用操作两种方式:HTTP协议,SSH协议,也就是经常在git仓库克隆时看到的URL前面有个选项:HTTP or SSH,使用 HTTP 时地址为 https://github.com/xxxx/yyy.git ,使用 SSH 时地址为 git@github.com:xxxx/yyy.git。
然后如果使用 SSH,那么你还需要这么执行以下操作步骤:
- 本机执行
ssh-keygen -t rsa -C '邮箱',一路回车,完了在~/.ssh/目录中会生成两个文件:it_rsa(私钥文件) 和id_rsa.pub(公钥文件) - 将
id_rsa.pub中的内容,复制出来,到GitHub中,个人设置,SSH Key管理,新增Key,然后黏贴进去,保存提交。 - 最后你就可以愉快的使用
git -h的各种命令把你的代码再仓库中操作来操作去。
如果不这么操作,那么只能通过 http协议操作,需要输入GitHub的账号密码,不再多说。
铺垫这么多,言归正传~
其实当你 ssh root@192.168.1.100 时,SSH 默认就会将 id_rsa 私钥,传输给服务器,然后到服务器的~/.ssh/authorized_keys文件中去找对应的公钥 id_rsa.pub 的内容,如果找不到,则会提示让你输入密码,如果找到,就直接登录了。
所以免密码只需要三步即可完成:
- 本机执行
ssh-keygen -t rsa -C '自己起个名字' - 复制
~/.ssh/id_rsa.pub的内容 - 登录服务器,编辑
~/.ssh/authorized_keys(如果是第一次,这个文件不存在,则需要新建)文件,把复制的内容黏贴进去,注意一行一个,最后不要有空行,有时候登录不成功,就可能是格式问题。
以上三步结束,在 ssh root@192.168.1.100,你就发现终于可以 一步登天了,恭喜成功。
SSH 配置管理
如果你只有一对秘钥,用在所有的GIT平台,和所有的 服务器中,那么当你私钥泄露时,你是不是要去所有的平台去把添加的公钥都给干掉,那不是很麻烦吗?当然如果是个人,也没多少,无所谓啦~
下面有一种更加方便管理的方式,使用~/.ssh/config配置文件管理,大概内容如下:
# 这是 192.168.1.100 相关的信息的注释
Host centos-100
HostName 192.168.1.100
User root
Port 22
IdentityFile ~/.ssh/id_rsa
上面只是一个服务器的配置,你可以配置很多,而且,参数也不仅仅这些,可以参考下方连接,上面的参数做下简要说明:
Host:连接别名HostName:IPUser:用户Port:端口IdentityFile:私钥文件位置
例如示例中的配置,完了之后,就可以直接这样用 ssh centos-100 就可以,并且当你输入前面几个字母时,命令行终端还会帮你自动提示,就很强,并且,如果你如果做了免密码,这里依然是OK的。
上面说了可以配置多个,其实不单单是配置多个服务器哦,这里最佳体现,是可以使用多个秘钥对,就是给一个服务器申请一个秘钥对,一对秘钥对,只用来免密一台服务器,方便维护管理。
生成多对秘钥
前面执行 ssh-keygen -t rsa -c 'xxx',默认生成的文件名是 id_rsa和id_rsa.pub,其实是可以指定名称的:
ssh-keygen -t rsa -f ~/.ssh/centos-106
其中-f ~/.ssh/centos-106 就是指定文件名,注意这里用到了路径,如果不使用路径,默认生成到当前执行命令所在的目录。
使用这种方式生成多对秘钥,在通过 ~/.ssh/config 文件,进行配置,即维护了多台服务器之间独立秘钥,又方便快捷管理。
注意事项
通过上面这种方式,其实可以发现,以后换了电脑或者电脑要重装系统时,把本地~/.ssh目录备份一下,我个人就是在每次新增秘钥对时,都会打包备份一次。
注意哦:~/.ssh 目录中的文件,对权限有要求哦,查看一下:ls -l ~/.ssh:
......
-rw------- 1 xxxxxx staff 1.8K 3 17 2020 id_rsa
-rw-r--r-- 1 xxxxxx staff 400B 3 17 2020 id_rsa.pub
......
公钥文件(id_rsa.pub):644,私钥文件(id_rsa):600。
也就是说,当公钥添加到服务器之后,我们只要有私钥文件,和目标服务器IP和用户名,并且权限是 600,就可以直接登录,前几天刚帮朋友调试个问题,问他要了私钥文件,操作成功~
参考
PS:关于 RSA 更多信息,可以自行去搜索,在一些对安全性高的应用中,都会用到RSA加密,我之前在公司做的一个项目,涉及到了数据库敏感信息等,就是使用RSA非对称加密~