如何让 ssh-agent 根据需要自动添加密钥?

如何让 ssh-agent 根据需要自动添加密钥?

我想运行 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(如果尚未添加),最后连接到主机。我相信它可以改进,所以我愿意接受反馈。

相关内容