![如何让 ssh-agent 根据需要自动添加密钥?](https://linux22.com/image/1287066/%E5%A6%82%E4%BD%95%E8%AE%A9%20ssh-agent%20%E6%A0%B9%E6%8D%AE%E9%9C%80%E8%A6%81%E8%87%AA%E5%8A%A8%E6%B7%BB%E5%8A%A0%E5%AF%86%E9%92%A5%EF%BC%9F.png)
我想运行 ssh-agent(具有最长生命周期选项),但不在启动时添加任何密钥,而是根据需要添加它们。
就像我第一次登录某个服务器时它应该要求输入密码一样,下一次(除非我等了一个多小时)它应该可以干净地连接:
ssh server1
Enter passphrase for key '/home/vi/.ssh/id_dsa':
server1> ...
ssh server2
server2> # no passphrase this time
# wait for lifetime
ssh server2
Enter passphrase for key '/home/vi/.ssh/id_dsa':
我不想每次都手动记住运行“ssh-add”。(例如仅为 ssh 输入密码,然后“哦,它没有记住,需要重新输入”)。
如果用户提供了密码,如何配置 ssh 来自动将密钥添加到 ssh-agent?
答案1
ssh 支持在首次使用时向代理添加密钥(自 7.2 版起)。您可以通过将以下内容放入来启用该功能~/.ssh/config
:
AddKeysToAgent yes
当使用衍生工具(例如 git)时这也有效。
来自7.2 更新日志:
- ssh(1):添加 AddKeysToAgent 客户端选项,可设置为“yes”、“no”、“ask”或“confirm”,默认为“no”。启用后,如果 ssh-agent 正在运行,则身份验证期间使用的私钥将添加到 ssh-agent(如果设置为“confirm”,则启用确认)。
答案2
你可以作弊,alias ssh='ssh-add -l || ssh-add && ssh'
在你的.bashrc
/上放一些类似的东西.profile
。这会首先运行ssh-add -l
,它可以返回 0(代理上有密钥)、1(无密钥)或 2(没有代理正在运行);如果返回 0,ssh
将运行;如果返回 1,ssh-add
将运行然后ssh
;如果返回 2,ssh-add
将失败并且ssh
不会运行。如果您想在没有代理运行时运行,请将 替换&&
为。;
ssh
答案3
在 ssh 支持 auto-call-ssh-add 之前,我.bashrc
根据 Kovensky 的提议在我的 中添加了此功能:
ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'
未添加身份时才会创建别名,一旦运行别名就会自行销毁。
这样,添加身份后就可以使用常规的 ssh 命令。
答案4
我正在使用以下 shell 函数:
ssh() {
local possible_keys=($(/usr/bin/env ssh -G $@ | grep '^identityfile' \
| cut -d " " -f 2- | sed -e "s|^~|$HOME|"))
for k in $possible_keys; do
if [[ -f $k ]]; then
local fingerprint=$(ssh-keygen -lf $k)
ssh-add -l | grep -q "$fingerprint" || ssh-add $k
fi
done
/usr/bin/env ssh $@
return $?
}
它首先解析我尝试连接的主机的配置,然后将该主机的可能密钥添加到 ssh-agent(如果尚未添加),最后连接到主机。我相信它可以改进,所以我愿意接受反馈。