43

Я хочу запустить 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, если пользователь предоставил ключевую фразу?

4 ответа4

47

ssh поддерживает добавление ключа к агенту при первом использовании (начиная с версии 7.2). Вы можете включить эту функцию, поместив следующее в ~/.ssh/config

AddKeysToAgent yes

Это также работает при использовании производных инструментов, таких как git.

Из журнала изменений 7.2:

* ssh(1): Add an AddKeysToAgent client option which can be set to
   'yes', 'no', 'ask', or 'confirm', and defaults to 'no'.  When
   enabled, a private key that is used during authentication will be
   added to ssh-agent if it is running (with confirmation enabled if
   set to 'confirm').
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 работал, даже если агент не запущен.

5

Пока ssh не поддерживает auto-call-ssh-add, я добавил это в свой .bashrc , основываясь на предложении Ковенского:

ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'

Псевдоним создается только в том случае, если идентификатор не добавляется, а псевдоним уничтожается сам после запуска.

Таким образом, обычная команда ssh используется после добавления идентификатора.

0

Я использую следующую функцию оболочки:

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, если они еще не добавлены, и, наконец, подключается к хосту. Я уверен, что это может быть улучшено, поэтому я открыт для обратной связи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .