如何使ssh-agent按需自动添加密钥?


51

我想运行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添加密钥?


Answers:


58

ssh支持在首次使用时向代理添加密钥(自7.2版开始)。您可以通过以下方法启用该功能~/.ssh/config

AddKeysToAgent yes

使用衍生工具(例如git)时,此方法也适用。

7.2更新日志

  • ssh(1):添加一个AddKeysToAgent客户端选项,该选项可以设置为“是”,“否”,“询问”或“确认”,并且默认为“否”。启用后,身份验证过程中使用的私钥将在运行时添加到ssh-agent(如果设置为“ confirm”,则启用确认)。

这要求ssh-agent运行。请参阅stackoverflow.com/a/24347344/4573065及其注释,以启动它的好方法(仅一次)。
ST-DDT

18

您可以作弊,然后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命令不使用它,它也会请求密钥密码。
六。

@Vi。是的,但是很少使用不使用它们的命令(除非您要连接到使用键盘交互功能的服务器)。不过,只要以后需要,密钥就会在代理中。另外,幸运的是(或不幸的是)别名不会更改ssh的后端使用(例如git或rsync)。
Jessidhia '04

2
(考虑为ssh客户端编写auto-call-ssh-add补丁)
Vi。

根据此答案,您可以为特定主机创建别名:alias ssh-hostname='(ssh-add -l | grep hostname > /dev/null) || ssh-add ~/.ssh/id_rsa_hostname && ssh -p 12345 username@hostname'。您甚至可以将其放入所有ssh密钥的循环中,并生成别名。肮脏的骇客,但行得通。
dset0x

5

直到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命令。


因为ssh-add也没有配置超时,所以在我的情况下不起作用,但是这个想法已经足够了。
六。

@Vi。超时将如何影响呢?这对我来说似乎很棒。
兰拉特

1
@lanrat,这将检查ssh-agent中是否存在密钥,并根据存在情况配置别名。但是由于超时(ssh-add -t ...),添加到ssh-agent的密钥可能会突然消失,但是别名仍将保留,因为密钥仍在内存中。
六。

1

我正在使用以下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中,最后连接到该主机。我敢肯定它可以改进,因此我愿意征求反馈。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.