ssh登录服务器场景
假设有两台机器,分别是:
源机器:主机A(hostA),ip:198.168.0.1
目标机器:主机B(hostB),ip:192.168.0.2
ssh-key免密连接原理
源机器想要使用ssh-key免密连接到目标机器,就要先了解ssh-key免密连接的原理(见下图)。
ssh-key免密连接前提
理解了上面的原理图,剩下要做的,无非就是两件事:
(一)在源机器创建ssh-key密钥对
(二)将ssh-key中的公钥写入到目标机器的授权密钥文件里
在源机器创建ssh-key密钥对
第(一)件事很简单:要在源机器(即主机A,ip:192.168.0.1)生成ssh-key密钥对,可以通过ssh-keygen指令 (windows机器可以使用git客户端的git-bash.exe)。
bash
# 执行 ssh-keygen --help 可以看到生成ssh-key的可选加密算法类型encryprType有:[-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa],其中rsa是默认的加密算法。
# 推荐使用ed25519加密算法,比默认的rsa算法更快更安全,生成的密钥内容也更短。
ssh-keygen -t ed25519
# 执行上面指令后,第一步会提示生成的私钥文件的默认路径(即~/.ssh/id_{encryptionType},默认保存到当前用户的.ssh目录(即~/.ssh/))(如有需要可自行修改路径或文件名),第二第三步是二次确认访问该ssh-key的密码,一般都留空直接回车。
三次回车后,可以在当前用户home目录的**.ssh文件夹** (即**~/.ssh/** )找到该ssh-key密钥对:id_ed25519 和 id_ed25519.pub 。其中带.pub后缀的为公钥 ,不带.pub后缀的为私钥。这两个文件的内容都是文本,可以编辑和查看。
将ssh-key中的公钥写入到目标机器的授权密钥文件里
第(二)件事也很简单:要完成目标机器(即主机B,ip:192.168.0.2)对源机器(即主机A,ip:192.168.0.1)的ssh-key授权,有两种方式:
方式1、在主机A通过ssh-copy-id指令将本机的公钥文本内容写入到主机B的授权密钥文件里
如果主机B的ssh端口是默认的22端口,也可以省去- p 22。如果是要登录主机B的非root用户,则修改为目标用户的用户名。这种方式需要输入目标用户的登录密码。
bash
ssh-copy-id [-p 22] root@192.168.0.2
#输入主机B用户的登录密码后,执行成功则可以在主机B的目标用户home目录的.ssh文件夹(即~/.ssh/)的authorized_keys文件 (即授权密钥文件)看到成功追加了主机A的ssh-key公钥(即id_ed25519.pub)的文本内容。
方式2、可以跳过ssh-copy-id指令,直接登录主机B的目标用户,编辑目标用户的授权密钥文件 (即**~/.ssh/authorized_keys** ,++没有该文件则需用touch指令先创建该文件++),把主机A的ssh-key公钥(即id_ed25519.pub)的文本内容追加进来。
ssh-key免密登录目标机器
上述两个前提完成了,就可以在源机器(即主机A,ip:192.168.0.1)执行ssh指令通过ssh-key免密登录到目标机器(即主机B,ip:192.168.0.2)。
bash
ssh [-p 22] root@192.168.0.2
如果想在源机器上使用ssh工具(比如XShell、WindTerm、MonaXterm等)通过ssh-key免密登录到目标机器呢?
打开ssh工具,填写目标机器(即主机B,ip:192.168.0.2)的ip、端口、用户名,然后输入登录密码的界面通常都会有另一个选项或选项卡,一般叫做"public key"或"ssh key"之类的。点击该选项或选项卡会要求选择密钥文件或身份文件,选择ssh-key私钥 (即id_ed25519文件)然后就可以免密登录了。
ssh-key免密连接git站
现在常用的git代码仓库网站(简称git站)有:gitee、coding、github、gitlab、bitbucket等。
在git站注册了账号后,可以进入账号设置里面添加ssh-key,从而实现你本地机器免密clone、pull、push你在该git网站的仓库(即项目代码)。这个功能利用的就是ssh-key免密连接原理。
git站的这个功能和使用ssh-key免密登录服务器就仅仅是第(二)步的操作方式不同而已:
都是采用的方式2,只不过源机器的ssh-key公钥(即id_ed25519.pub)文本内容不是直接写入到目标机器的目标用户的授权密钥文件里,而是粘贴到git站的账号设置里的ssh-key配置项。