ssh-agent 与 ssh-add #
ssh-agent 是一个管理 ssh 私钥的本地服务,使用 ssh-add FILE 命令即可将密钥对保存到内存当中。
ssh-agent 运作原理 #
- ssh 客户端:在登录远程服务器过程中,首先通过连接 ssh-agent 的 Unix 套接字文件向 ssh-agent 服务发送查询公钥列表的请求。
- ssh-agent 服务:将已加载在内存中的的公钥列表返回给 ssh 客户端。
- ssh 客户端:将这些公钥列表以及用户目录中存在的公钥列表一起发送给服务器。
- 服务器:返回其中一个已被信任的公钥和一个随机数据给客户端,要求客户端用私钥进行签名。(若所有公钥都不被服务器信任则无法使用私钥进行登录,客户端将退化为密码登录)
- ssh 客户端:将这个随机数和公钥发送给 ssh-agent,向其查询签名数据。
- ssh-agent 服务:用公钥对应的私钥对数据进行签名,然后返回签名数据给客户端。(若该私钥未被 ssh-agent 加载,则客户端自行查找对应私钥进行签名)
- ssh 客户端:将签名数据发送给服务器。
- 服务器:使用该公钥验证签名成功,允许客户端登录。
不启用 ssh-agent 会如何? #
如果私钥文件是加密的,那么每次登录远程服务器都需要输入口令来解密私钥文件,比较繁琐。 而启用了 ssh-agent 服务的话,只需要在加载私钥时输入一次口令,而在登录时无需输入口令。
使用方法 #
bash
# 启动 ssh-agent 服务并自动设置环境变量 SSH_AGNET_SOCK
# (注意,环境变量仅对当前 shell 生效,建议添加到 shell 初始化脚本,比如 ~/.bashrc)
# (该环境变量的值其实就是 ssh-agent 服务的 Unix 套接字文件路径,若 ssh 客户端在登录过程中读取到该环境变量的值,则后续会向该套接字发送一系列查询请求)
eval $(ssh-agent)
# 可以通过执行这个命令来打印该环境变量,检查是否设置成功:
# echo $SSH_AGNET_SOCK
# 关闭 ssh-agent 并移除环境变量
# eval $(ssh-agent -k)
# 添加私钥到 ssh-agent 服务中
ssh-add [FILE...]
# 列出公钥指纹
ssh-add -l
# Output:
2048 SHA256:nqDfF8vqBoCotVyys8Qo4PFRHmGckjQuFAN5E4SCkG0 /root/.ssh/id_rsa (RSA)
# 列出公钥
ssh-add -L
# Output:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABA.... /root/.ssh/id_rsa
# 移除指定私钥
ssh-add -d [FILE...]
# 移除所有私钥
ssh-add -D