Як зробити так, щоб ssh-агент автоматично додав ключ на вимогу?


51

Я хочу запустити ssh-агент (з максимальною можливістю експлуатації), але не додавати жодних ключів при запуску, а замість цього додати їх на вимогу.

Як і перший раз, коли я входжу на якийсь сервер, він повинен запитати пароль, наступного разу (якщо я не чекав більше години), він повинен підключитися чисто:

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-агента, якщо користувач надав пароль?


Відповіді:


58

ssh підтримує додавання ключа до агента при першому використанні (починаючи з версії 7.2). Ви можете ввімкнути цю функцію, ввівши наступне ~/.ssh/config:

AddKeysToAgent yes

Це також працює при використанні похідних інструментів, таких як git.

З 7,2 зміни змін :

  • ssh (1): додайте клієнтську опцію AddKeysToAgent, яку можна встановити на "так", "ні", "запитати" або "підтвердити", а за замовчуванням - на "ні". Якщо ввімкнено, приватний ключ, який використовується під час аутентифікації, буде доданий до ssh-агента, якщо він працює (з підтвердженням увімкнено, якщо встановлено значення "підтвердити").

Для цього потрібен запуск ssh-агента. Зверніться до 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).
Джессідхія

2
(розмірковуючи про те, щоб написати патч auto-call-ssh-add для клієнта ssh)
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

Поки функцію auto-call-ssh-add не підтримує ssh, я додав це до свого .bashrc, спираючись на пропозицію Ковенського:

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

Псевдонім створюється лише в тому випадку, якщо ідентифікація не додана, і псевдонім знищує себе один раз при запуску.

Таким чином використовується звичайна команда ssh після додавання ідентичності.


У моєму випадку не спрацює, оскільки в ssh-add також налаштовано тайм-аут, але ідея досить хороша.
Ві.

@Vi. Як вплине на це тайм-аут? Мені здається, це чудово працює для мене.
lanrat

1
@lanrat, Це перевіряє наявність ключа в ssh-агенті та налаштовує псевдонім залежно від присутності. Але через timeout ( ssh-add -t ...) ключ, доданий до ssh-агента, може різко відійти, але псевдонім залишиться так, як ключ все ще зберігається в пам'яті.
Ві.

1

Я використовую таку функцію оболонки:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.