Как заставить 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, если он запущен (с включенным подтверждением, если установлено значение «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, основываясь на предложении Ковенски:

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

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

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

решение4

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

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

Связанный контент