经常需要接触
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非对称加密
~