ssh-agent: авторизация по разным id_rsa ssh-ключам
При авторизации через ssh-ключ считывается только один дефолтный ~/.ssh/id_rsa ключ. И в случае когда для разных сервисов используются разные ключи - можно загрузить в shell-сеанс нужные ключи с помощью утилиты ssh-agent.
Логи авторизации для отладки проблем:
tail -f /var/log/auth.log
Примечание
В случае ошибки:
Unable to negotiate with 104.192.141.1 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss
Добавьте в ~/.ssh/config:
Host bitbucket.org
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
Примечание
Только ограниченное количество ключей может быть испробовано перед тем, как сервер отклонит авторизацию.
Чтобы не перебирать все ключи для серверов которые не прописаны в ~/.ssh/config добавьте это в конец конфига:
Host *
IdentitiesOnly=yes
Простой пример загрузки ключей в текущий shell-сеанс консоли:
eval $(ssh-agent) && ssh-add ~/.ssh/id_rsa_service_name && ssh-add ~/.ssh/id_rsa_service_other
Запускаем ssh-agent один раз и добавляем нужные ключи.
Но на каждый shell-сеанс нужно повторно загружать ssh-ключи. Иначе получаем сообщение:
Could not open a connection to your authentication agent.
Команды для отладки и мониторинга.
Запустить ssh-agent и проверить что есть процесс:
eval $(ssh-agent)
ps -e | grep ssh-agent
Команда eval экспортирует переменные, т.к. ssh-agent не делает этого по умолчанию.
Запуск ssh-agent и только вывод переменных окружения (переменные НЕ будут экспортированы):
ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-XXXXXXTlY9wj/agent.228759; export SSH_AUTH_SOCK;
SSH_AGENT_PID=228760; export SSH_AGENT_PID;
echo Agent pid 228760;
Опции ssh-agent:
-s создать переменные в стиле bash: SSH_AUTH_SOCK + SSH_AGENT_PID (по умолчанию)
-c создать переменные в стиле csh: SSH_AUTH_SOCK + SSH_AGENT_PID
-k Kill the current agent (given by the SSH_AGENT_PID environment variable).
-D Foreground mode. When this option is specified ssh-agent will not fork.
Список запущенных агентов:
ps -e | grep ssh-agent
Список загруженных ключей в текущем агенте:
ssh-add -l
Пример скрипта ~/.bash_ssh_agent для автоматического запуска одного процесса ssh-agent:
env_vars_file=~/.ssh/env-vars-ssh-agent.env
[[ -f "$env_vars_file" ]] || touch "$env_vars_file"
ssh-add -l &>/dev/null
if [[ "$?" == 2 ]]; then
test -r "$env_vars_file" && eval "$(<"$env_vars_file")" >/dev/null
ssh-add -l &>/dev/null
if [[ "$?" == 2 ]]; then
## umask 066 ## @note Установить права на создаваемые файлы
## ssh-agent > "$env_vars_file" ## @note Запускает ssh-agent и пишет в файл переменные SSH_AUTH_SOCK + SSH_AGENT_PID
( umask 066; ssh-agent > "$env_vars_file"; )
eval "$(<$env_vars_file)" >/dev/null ## @note Устанавливает переменные окружения запущенного агента SSH_AUTH_SOCK + SSH_AGENT_PID
[[ -f ~/.ssh/id_rsa_service1 ]] && ssh-add ~/.ssh/id_rsa_service1
[[ -f ~/.ssh/id_rsa_service2 ]] && ssh-add ~/.ssh/id_rsa_service2
[[ -f ~/.ssh/id_rsa_service3 ]] && ssh-add ~/.ssh/id_rsa_service3
fi
fi
Можно добавить запуск скрипта в ~/.bashrc:
[[ -f ~/.bash_ssh_agent ]] && . ~/.bash_ssh_agent
#ssh-agent, #ssh auth keys, #ssh multiple rsa keys