Please enable Javascript to view the contents

ssh agent详解

 ·   ·  ☕ 6 分钟

什么是 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

首先需要运行 ssh agent

  • 在 Linux 中: ssh-agentX 会话 或 **登录会话 **之初就已经启动
  • 在 Windows 中: 计算机管理 👉 服务 👉 OpenSSH Authentication Agent 设置为自动 启动。
    • 在 Windows 中更多配置 ssh-agent 自动启动的方法,见下文的 “配置 ssh-agent 自 动启动” 。

也可以手动运行,有两条命令可以用来启动:

  • ssh-agent $SHELL :它会在当前 shell 中启动一个默认 shell,作为当前 shell 的 子 shell,ssh-agent 会在子 shell 中运行;也可以明确指定 $SHELL ,比如 ssh-agent bashssh-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

可能的两种原因:

  1. 你的 公钥 并没有添加到 Github 服务器中。检查 GitHub 是否有添加。

  2. 您的密钥未加载到 ssh agent 中 。解决方法:

  • 检查相应的 ssh 密钥是否被加载:
ssh-add -l
  • 如果没有被加载,则使用下面的命令加载私钥
1
2
#后面可以同时跟多个私钥
ssh-add ~/.ssh/<private_key_file>
  • 运行 ssh-add 时, 如果提示 “Could not open a connection to your authentication agent.” 说明你的ssh-agent并没有运行;使用下面的命令运行 ssh agent,再使用ssh-add命令添加你的 ssh key。
1
2
3
4
5
6
7
8
# 先启动,再运行
# macOS/Linux
$ eval `ssh-agent`
ssh-add ~/.ssh/other_id_rsa

# 在Windows中的git-bash中
$ eval $(ssh-agent)
ssh-add ~/.ssh/other_id_rsa

配置 ssh-agent 自动启动

在 Linux 中 ssh-agentX 会话登录会话 之初就已经启动,一般都不 会有问题。

而在 Windows 中,我们可以这样配置:

  • 在 计算机管理 👉 服务 👉 OpenSSH Authentication Agent 设置为自动启动。
  • 也可以为 git bashpowershell 和 cmder 分别添加如下配置

git bash

方式一: Git for windows 提供的方式

.profile.bashrc 添加 :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 在.profile 或  .bashrc 添加
# Git for windows 提供的方式
# ssh-agent auto-launch (0 = agent running with key; 1 = w/o key; 2 = not run.)
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
if   [ $agent_run_state = 2 ]; then
  eval $(ssh-agent -s)
  ssh-add ~/.ssh/one_rsa # 添加你自己的私钥
  ssh-add ~/.ssh/two_rsa
elif [ $agent_run_state = 1 ]; then
  ssh-add ~/.ssh/one_rsa
  ssh-add ~/.ssh/two_rsa
fi
# 记得还要在 ~/.bash_logout 中添加,来关闭 ssh-agent
# ssh-agent -k

新建 ~/.bash_logout 文件,添加:

1
2
# 记得还要在 ~/.bash_logout 中添加,来关闭 ssh-agent
ssh-agent -k

方式二:GitHub 提供的方式

复制以下行并将其粘贴到 Git shell 中的 ~/.profile~/.bashrc 文件中:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add ~/.ssh/one_rsa # 添加你自己的私钥
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add ~/.ssh/one_rsa
fi

unset env

现在,当您初次运行 Git Bash 时,系统将提示您输入密码:

1
2
3
4
5
6
7
8
> Initializing new SSH agent...
> succeeded
> Enter passphrase for /c/Users/you/.ssh/id_rsa:
> Identity added: /c/Users/you/.ssh/id_rsa (/c/Users/you/.ssh/id_rsa)
> Welcome to Git (version 1.6.0.2-preview20080923)
>
> Run 'git help git' to display the help index.
> Run 'git help ' to display help for specific commands.

ssh-agent 进程将继续运行,直到您注销、关闭计算机或终止该进程。

powershell

在 PowerShell 的配置文件中添加,通过 在 powershell 中运行 notepad $PROFILE 来 打开配置文件

1
2
3
4
5
# Start SshAgent if not already
# Need this if you are using github as your remote git repository
if (! (ps | ? { $_.Name -eq 'ssh-agent'})) {
    Start-SshAgent
}

该方法还不够完善。

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"

相关命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 在子shell 创建并运行 ssh-agent
ssh-agent $SHELL

# 单独启动一个 ssh-agent 进程
eval `ssh-agent`
# 在windows 中为
eval $(ssh-agent)

# 杀死当前正在运行的代理 (注意使用条件)
ssh-agent -k

# 一般是使用默认shell进行输出
# 强制使用 C-shell 进行输出
ssh-agent -c
# 强制使用 sh 进行输出
ssh-agent -s

# 进入 debug 模式
ssh-agent -d

# 指定用于生成SSH密钥指纹的算法。 有效值包括md5和sha256
ssh-agent -E <fingerprint_hash>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 将私钥添加到 ssh-agent
ssh-add ~/.ssh/key_name

# 添加时同时指定私钥失效时间
ssh-add -t <seconds>

# 查看ssh-agent中的私钥
ssh-add -l

# 查看ssh-agent中的公钥
ssh-add -L

# 测试连接(这里是github)
ssh -T [email protected]

# 移除指定私钥
ssh-add -d ~/.ssh/key_name

# 移除ssh-agent 中的所有私钥
ssh-add -D

# 锁定ssh-agent :创建锁时需要设置密码
ssh-add -x

# 解锁 ssh-agent :输入密码
ssh-add -X
1
2
3
4
5
6
7
$ ssh-keygen -p
# Start the SSH key creation process
> Enter file in which the key is (/Users/you/.ssh/id_rsa): [Hit enter]
> Key has comment '/Users/you/.ssh/id_rsa'
> Enter new passphrase (empty for no passphrase): [Type new passphrase]
> Enter same passphrase again: [One more time for luck]
> Your identification has been saved with the new passphrase.

![ssh-agent 工作原理](https://raw.githubusercontent.com/fandean/images/master/PicGo/ssh-agent%E5%8E%9F%E7%90%86.png)

相关阅读和参考:

您的鼓励是我最大的动力
alipay QR Code

Felix
作者
Felix
如无必要,勿增实体。

3

目录