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