为了解决这些问题,我编写了一个有用的 ssh-agent 前端,它基于 bash,叫做 keychain 。 keychain 的特别之处在于它允许 每个系统使用一个 ssh-agent 进程,而非每次登录会话。这意味着您只需对每个专用密钥执行一次 ssh-add ,就一次。正如我们稍后将要看到的一样, keychain 甚至有助于优化 ssh-add ,而这只要它试图向那些正在运行的 ssh-agent 添加其高速缓存中没有的专用密钥。
以下对 keychain 如何工作从头到尾浏览一遍。从 ~/.bash_profile 中启动时, keychain 将首先查看 ssh-agent 是否已经在运行了。如果没有,它就启动 ssh-agent 并把重要的 SSH_AUTH_SOCK 和 SSH_AGENT_PID 变量记录在 ~/.ssh-agent 文件中,一方面为了安全而保存,另一方面也是为了以后的使用。这是启动 keychain 的最佳途径;同使用平淡无奇的老式 ssh-agent 一样,我们在 ~/.bash_profile 内部执行必要的配置:
#!/bin/bash #example ~/.bash_profile file /usr/bin/keychain ~/.ssh/id_rsa #redirect ~/.ssh-agent output to /dev/null to zap the annoying #"Agent PID" message source ~/.ssh-agent > /dev/null正如您所看到的,对于 keychain 我们用 source 命令读入并执行 ~/.ssh-agent 文件,而不是象我们直接使用 ssh-agent 时所做的对输出进行计算。但是,结果是一样的:定义了非常重要的 SSH_AUTH_SOCK,而且正运行 ssh-agent 以备使用。同时,因为 SSH_AUTH_SOCK 被记录在 ~/.ssh-agent 里,只要用 source 命令读入并执行 ~/.ssh-agent 文件,就可以轻易的把我们的 shell 脚本及 cron 作业同 ssh-agent 连接起来。 keychain 本身也利用了这个文件;您应该记住 keychain 启动时,它会查看现有的 ssh-agent 是否正在运行。如果是,则它使用 ~/.ssh-agent 文件来获得适当的 SSH_AUTH_SOCK 设置,这样就使 keychain 能使用现有的代理程序而不必新启动一个。只有在 ~/.ssh-agent 文件无效(指向一个不存在的 ssh-agent )或 ~/.ssh-agent 文件本身不存在时, keychain 才会启动新的 ssh-agent 进程。
安装 keychain 很容易。首先,直接到 keychain 工程主页下载可用的 keychain 源压缩文档的最新版本。然后,安装如下:
# tar xzvf keychain-1.0.tar.gz # cd keychain-1.0 # install -m0755 keychain /usr/bin既然 keychain 在 /usr/bin/ 目录下,就请把它添加到您的 ~/.bash_profile 中,并把您的专用密钥路径作为参数。下面是一个既标准又好的启用 keychain 的 ~/.bash_profile:
启用 keychain 的 ~/.bash_profile 示例
#!/bin/bash #on this next line, we start keychain and point it to the private keys that #we'd like it to cache /usr/bin/keychain ~/.ssh/id_rsa ~/.ssh/id_dsa source ~/.ssh-agent > /dev/null #sourcing ~/.bashrc is a good thing source ~/.bashrc
您一为每次登录时调用 keychain 配置好了 ~/.bash_profile,就请先退出再登录回来。在您再次登录时, keychain 将启动 ssh-agent ,并记录下 ~/.ssh-agent 中的代理程序环境变量设置,然后提示您输入在 ~/.bash_profile 中的 keychain 命令行指定的所有专用密钥的密码短语:
Keychain 首次启动
您一输入密码短语,您的专用密钥就会被高速缓存,同时 keychain 将退出。接着,用 source 命令读入并执行 ~/.ssh-agent,初始化您的登录会话以便同 ssh-agent 一起使用。现在,如果您退出,然后再登录回来,将发现 keychain 会找到现有的 ssh-agent 进程;在您退出时,它并没有终止。此外, keychain 将验证您指定的专用密钥是否已经在 ssh-agent 的高速缓存中了。如果没有,那么将会提示您输入正确的密码短语,但如果一切进展顺利,则现有 ssh-agent 仍包含有您以前添加的专用密钥;这意味着不会提示您输入密码:
Keychain 找到现有的 ssh-agent
祝贺您!您刚才已经登录了,应该能够用 ssh 和 scp 连到远程系统;您不必一登录就使用 ssh-add ,而且 ssh 和 scp 也不会提示您输入密码短语。事实上,只要初始的 ssh-agent 进程一直在运行,您就能不提供密码登录并建立 ssh 连接。 ssh-agent 进程持续运行直到机器重新启动也是很有可能的;由于您最可能在 Linux 系统上这样设置,所以也许一连几个月您都不必输入密码短语!欢迎来到安全的、使用 RSA 和 DSA 认证无密码连接的世界。
继续创建几个新的登录会话,您会发现每次 keychain 都会准确无误的“钩住”到同一 ssh-agent 进程。不要忘记您也可以使 cron 作业和脚本“钩住”正在运行的 ssh-agent 进程。要在 shell 脚本和 cron 作业中使用 ssh 或 scp 命令,只要确保先用 source 命令读入并执行 ~/.ssh-agent:
source ~/.ssh-agent然后,随后所有的 ssh 或 scp 命令就能够找到当前正在运行的 ssh-agent ,并且象您在 shell 中一样能建立安全的无密码连接。