ssh-agent: авторизация по разным id_rsa ssh-ключам

Категория: Utilities

При авторизации через ssh-ключ считывается только один дефолтный ~/.ssh/id_rsa ключ. И в случае когда для разных сервисов используются разные ключи - можно загрузить в shell-сеанс нужные ключи с помощью утилиты ssh-agent.

Примечание

Только ограниченное количество ключей может быть испробовано перед тем, как сервер отклонит авторизацию.

Чтобы не перебирать все ключи для серверов которые не прописаны в ~/.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

категория: Utilities