什么是 ssh agent?
ssh agent ,意为 ssh 代理,是一个密钥管理器,用来管理一个多个密钥,并为其他需要 使用 ssh key 的程序提供代理。
为什么需要 ssh agent?
SSH 只是一种协议,其开源实现有 OpenSSH,并且存在服务端(sshd) 和 客户端 (ssh),Windows 中的客户端有 PuTTY;而这两种客户端都有各自的 ssh agent:
ssh-agent
命令:是客户端 ssh 的默认代理- Pageant : 是 客户端 PuTTY 的代理。Pageant是用于PuTTY,PSCP,PSFTP和Plink的SSH身份验证代理。 Pageant会存储您的私钥,只要它正在运行,它就会为PuTTY或其他工具(如IntelliJ IDEA)提供解锁的私钥。(当然
ssh-agent
也能做)
把私钥交给 ssh agent 管理的好处:
-
当 其他程序 需要身份验证的时候 可以将验证申请交给 ssh-agent 来完成整个认证过程 。使用不同的密钥连接到不同的主机时,需要要手动指定对应的密钥,而 ssh 代理可以 自动帮助我们选择对应的密钥进行认证。
-
避免重复输入密码:如果您的私钥使用密码短语来加密了的话,每一次使用 SSH 密钥对 进行登录的时候,您都必须输入正确的密码短语。而 SSH agent 程序能够将您的已解密 的私钥缓存起来,在需要的时候提供给您的 SSH 客户端。这样子,您就只需要在使用
ssh-add
时将私钥加入 SSH agent 缓存的时候,输入一次密码短语就可以了。这为经 常使用 SSH 连接用户提供了不少便利。
ssh-agent 工作原理:(本地客户端)
如何配置 ssh agent
首先需要运行 ssh agent
- 在 Linux 中:
ssh-agent
在 X 会话 或 **登录会话 **之初就已经启动 - 在 Windows 中: 计算机管理 👉 服务 👉 OpenSSH Authentication Agent 设置为自动
启动。
- 在 Windows 中更多配置 ssh-agent 自动启动的方法,见下文的 “配置 ssh-agent 自 动启动” 。
也可以手动运行,有两条命令可以用来启动:
ssh-agent $SHELL
:它会在当前 shell 中启动一个默认 shell,作为当前 shell 的 子 shell,ssh-agent 会在子 shell 中运行;也可以明确指定$SHELL
,比如ssh-agent bash
,ssh-agent
会随者当前 ssh 会话的结束而结束,这是一种安全 机制。- eval `shell-agent` , 在 windows 中为
eval $(ssh-agent)
: 它并不会启动一 个子 shell,而是直接启动一个 ssh-agent 进程;此时当我们退出当前 bash 后 ,ssh-agent 进程并不会自动关闭。我们可以在当前 bash 退出之前,使用ssh-agent -k
,或者在当前 bash 退出之后,使用kill
命令,关闭对应的 ssh-agent 进程。
运行 ssh agent 以后,会加载默认的私钥,
如果有多个密钥,则需要在 ~/.ssh/config
中进行配置:
-
一般来说 ssh agent 程序可以根据配置自动加载并管理这些密钥;但如果发现某个密钥 没有加载则
-
也可以手动使用
ssh-add
命令将某个私钥交给 ssh-agent 保管,
ssh-agent 相关问题
当我们在中尝试使用 Git 并通过 SSH 协议进行 push 或 pull 时,如果远程 Github 服务 器无法使用 SSH agent 提供的密钥进行身份验证,则可能会收到下面的某一条消息:
- Permission denied (publickey)
- No suitable response from remote
- repository access denied
可能的两种原因:
-
你的 公钥 并没有添加到 Github 服务器中。检查 GitHub 是否有添加。
-
您的密钥未加载到 ssh agent 中 。解决方法:
- 检查相应的 ssh 密钥是否被加载:
ssh-add -l
- 如果没有被加载,则使用下面的命令加载私钥
|
|
- 运行
ssh-add
时, 如果提示 “Could not open a connection to your authentication agent.” 说明你的ssh-agent
并没有运行;使用下面的命令运行 ssh agent,再使用ssh-add
命令添加你的 ssh key。
|
|
配置 ssh-agent 自动启动
在 Linux 中
ssh-agent
在 X 会话 或 登录会话 之初就已经启动,一般都不 会有问题。
而在 Windows 中,我们可以这样配置:
- 在 计算机管理 👉 服务 👉 OpenSSH Authentication Agent 设置为自动启动。
- 也可以为
git bash
、powershell
和 cmder 分别添加如下配置
git bash
方式一: Git for windows 提供的方式
在 .profile
或 .bashrc
添加 :
|
|
新建 ~/.bash_logout
文件,添加:
|
|
方式二:GitHub 提供的方式
复制以下行并将其粘贴到 Git shell 中的 ~/.profile
或 ~/.bashrc
文件中:
|
|
现在,当您初次运行 Git Bash 时,系统将提示您输入密码:
|
|
ssh-agent
进程将继续运行,直到您注销、关闭计算机或终止该进程。
powershell
在 PowerShell 的配置文件中添加,通过 在 powershell 中运行 notepad $PROFILE
来
打开配置文件
|
|
该方法还不够完善。
cmd
如果你使用的是 cmder ,则还可以为 cmd 进 行如下配置:
- 首先在 cmder 中确认当前在 cmd 标签页中
- 再测试以下
git push
命令,或 运行ssh -T [email protected]
来进行测试 - 如果还是提示
Permission denied
,则进行下面的操作:
在 cmd 模式中运行 start-ssh-agent
即可启动 ssh-agent ,然后进行 代码推送,推送
完成后可选择输入exit
退出 ssh-agent。
如果想要 ssh-agent 在 cmd 模式中自动启动,需要在
%CMDER_ROOT%/config/user-profile.cmd
文件中取消注释
@call "%GIT_INSTALL_ROOT%/cmd/start-ssh-agent.cmd"
相关命令
相关阅读和参考: