例如:主机名为node1无密码登录主机名为node2
一、在node1上执行:
cd ~/.ssh
(若没有该目录,先执行ssh localhost)rm ./id_rsa*
(删除之前生成的公钥)ssh-keygen -t rsa
(生成公钥,此时一直按回车就行)cat ./id_rsa.pub >> ./authorized_keys
scp ~/.ssh/id_rsa.pub ubuntu@node2:/home/node2/
(将公钥传输到node2)
二、在node2上执行:
mkdir ~/.ssh
(若不存在先创建,若存在则可忽略此步)cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub
(用完即可删除)
三、结果:ssh ubuntu@node2的IP
可以直接登录不需要输入密码了
补充: 如果登录报错sign_and_send_pubkey: signing failed: agent refused operation
- 在node1主机上执行
eval "$(ssh-agent -s)"
和ssh-add
即可解决。
四、认证流程:以下将登陆端称为"客户端",被登录端称为"服务端"。
- 客户端生成一个密钥对,私钥自己保留,将公钥拷贝给服务端。
- 客户端发送免密登录请求。
- 服务器查找
~/.ssh/authorized_keys
文件下是否有对应客户端IP的公钥。 - 如果有,则随机生成一段字符串,并用客户端的公钥将字符串进行加密,然后发送给客户端。
- 客户端收到加密的字符串后,用私钥进行解密。
- 客户端将解密之后的字符串发送给服务端。
- 服务端检查客户端发来的字符串与之前发给客户端的字符串是否一致,若一致则验证通过。