Другое

Как отключить постоянный запрос пароля SSH‑ключа в Git

Узнайте, почему Git постоянно запрашивает пароль SSH‑ключа, и получите пошаговое решение для macOS и Linux, чтобы устранить повторные запросы аутентификации.

Git постоянно запрашивает пароль для моего SSH‑ключа каждый раз, когда я пытаюсь выполнить pull или push, хотя я создал ключи, следуя руководству GitHub, добавил их в свой аккаунт GitHub и явно использовал ssh‑agent. Что может вызывать эту проблему?

Git постоянно запрашивает пароль вашего SSH‑ключа, даже если он настроен правильно, потому что ssh‑agent не сохраняется между сессиями или не настроен должным образом с системным ключевым хранилищем. Это особенно актуально на macOS, где Apple изменил поведение в Sierra и более поздних версиях. Такая ситуация может возникнуть, если вы запускаете несколько экземпляров ssh‑agent, не настроили файл конфигурации SSH должным образом или не добавили пароль в системный keychain для автоматической разблокировки.


Содержание


Распространённые причины появления запросов пароля SSH

Постоянная проблема с паролем обычно связана с несколькими распространёнными проблемами конфигурации и сохранения ssh‑agent.

Множественные экземпляры ssh‑agent могут конфликтовать: один агент имеет ваш ключ загруженным, а другой – нет. Это часто случается, если вы вручную запускаете eval $(ssh-agent) в разных терминалах без надлежащего управления процессом агента.

Проблемы сохранения сессии. Процесс ssh‑agent обычно завершается при закрытии терминала или выходе из системы, из‑за чего загруженные ключи теряются. Это заставляет вас вводить пароль каждый раз, когда вы открываете новую сессию. Как отмечено в Unix & Linux Stack Exchange, это особенно проблематично на системах, где каждая оболочка запускается независимо.

Проблемы интеграции с keychain особенно распространены на macOS. Как отмечено в обсуждениях Stack Overflow, Apple намеренно изменил поведение ssh‑agent в macOS Sierra (10.12), чтобы он больше не загружал ранее сохранённые SSH‑ключи из keychain, требуя дополнительной настройки для поддержания прежнего поведения.


Решения, специфичные для macOS

macOS требует особого внимания из‑за изменений Apple в управлении keychain для SSH‑ключей. Самое эффективное решение – правильно настроить ssh-add для использования системного keychain.

Интеграция с Keychain

Для macOS Catalina и новее используйте флаг --apple-use-keychain:

bash
ssh-add --apple-use-keychain ~/.ssh/id_rsa

Если вы получите ошибку «ssh-add: illegal option – apple-use-keychain», используйте полный путь к ssh-add от Apple:

bash
/usr/bin/ssh-add --apple-use-keychain ~/.ssh/id_rsa

Устаревший метод keychain

Для более старых версий macOS или если вышеуказанное не работает, используйте флаг -K (устаревший, но всё ещё функционирующий на некоторых системах):

bash
ssh-add -K ~/.ssh/id_rsa

Как объясняет документация GitHub, опция --apple-use-keychain – это конкретная реализация Apple, которая интегрируется с macOS Keychain Services для хранения и извлечения паролей.

Автоматическая загрузка ключей

Чтобы автоматически загружать ключи при открытии нового терминала, добавьте следующее в ваш профиль оболочки (~/.zshrc, ~/.bash_profile или ~/.bashrc):

bash
# Запускаем ssh-agent, если он ещё не запущен
if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -A 2>/dev/null

Общая настройка ssh‑agent

Запуск и управление ssh‑agent

Правильное управление ssh‑agent критично для избежания повторных запросов пароля. Полный рабочий процесс:

  1. Запускаем ssh‑agent в фоновом режиме:

    bash
    eval "$(ssh-agent -s)"
    
  2. Добавляем ваш SSH‑ключ в агент:

    bash
    ssh-add ~/.ssh/id_rsa
    
  3. Проверяем, что ключ добавлен:

    bash
    ssh-add -l
    

Если вы всё ещё видите запрос пароля, попробуйте добавить его с интеграцией keychain:

bash
ssh-add -K ~/.ssh/id_rsa  # macOS legacy
ssh-add --apple-use-keychain ~/.ssh/id_rsa  # macOS modern

Сохранение сессии

Чтобы сохранить ssh‑agent между сессиями терминала, нужно хранить переменные окружения агента. Создайте скрипт для управления этим:

bash
#!/bin/bash
# ~/.ssh/agent_env
SSH_ENV="$HOME/.ssh/agent_env"

function start_agent {
    echo "Инициализируем новый ssh‑agent..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add ~/.ssh/id_rsa
}

# Подключаем настройки SSH, если они есть
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent
fi

Затем подключайте этот скрипт из вашего профиля оболочки.


Исправления в файле конфигурации SSH

Настройка ~/.ssh/config

Файл конфигурации SSH можно изменить, чтобы автоматически обрабатывать запросы пароля. Создайте или отредактируйте ~/.ssh/config:

Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_rsa

Эта конфигурация говорит SSH:

  • Использовать системный keychain для хранения паролей
  • Автоматически добавлять ключи в агент при использовании
  • Указывать, какой файл идентификации использовать

Как отмечает документация GitHub, если вы видите ошибку «Bad configuration option: usekeychain», возможно, вам нужно добавить настройку специально для хостов GitHub:

Host github.com
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_rsa

Настройки keychain

Для macOS убедитесь, что интеграция keychain настроена правильно. В вашем SSH‑конфиге:

Host *
  UseKeychain yes
  AddKeysToAgent yes
  ForwardAgent yes

Как подтверждает Apple Stack Exchange, эта комбинация настроек хорошо работает для многошаговых SSH‑соединений (Mac → GitHub → другие серверы).


Дополнительные шаги по устранению неполадок

Проверка множественных агентов

Если вы сталкиваетесь с проблемами, проверьте наличие нескольких процессов ssh‑agent:

bash
ps aux | grep ssh-agent

Убейте дублирующие агенты и перезапустите с чистой сессией:

bash
pkill ssh-agent
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

Проверка статуса ssh‑agent

Проверьте, какие ключи сейчас загружены в ваш ssh‑agent:

bash
ssh-add -l

Если ключей нет, добавьте их:

bash
ssh-add ~/.ssh/id_rsa

Тестирование SSH‑соединения

Проверьте ваше SSH‑соединение с GitHub, чтобы убедиться, что проблема с паролем сохраняется:

bash
ssh -vT git@github.com

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

Отладка проблем с keychain

Если вы подозреваете проблемы с keychain, попробуйте удалить и заново добавить ключ:

bash
ssh-add -d ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa

Для отладки keychain на macOS проверьте, содержит ли ваш keychain пароль SSH:

bash
security find-generic-password -wa "SSH: git@github.com"

Альтернативные решения

Удаление пароля

Если требования безопасности позволяют, вы можете полностью удалить пароль из вашего SSH‑ключа:

bash
ssh-keygen -p

Эта команда запросит текущий пароль и затем позволит оставить поле нового пароля пустым. Как отмечено в обсуждениях Reddit, это самый простой способ, но он снижает уровень безопасности.

Использование перенаправления агента (Agent Forwarding)

Для соединений сервер‑на‑сервер настройте перенаправление агента:

В вашем SSH‑конфиге:

Host github.com
  ForwardAgent yes

Это позволит использовать ваш локальный SSH‑агент при подключении через промежуточные серверы.

Использование Pageant на Windows

Если вы используете Windows с Git Bash, рассмотрите возможность использования Pageant (SSH‑агент PuTTY) вместо нативного ssh‑agent:

  1. Установите PuTTY
  2. Используйте Pageant для управления вашими SSH‑ключами
  3. Настройте Git на использование Pageant

Источники

  1. Stack Overflow – Git keeps asking me for my ssh key passphrase
  2. Stack Overflow – SSH Key – Still asking for password and passphrase
  3. Super User – How to avoid being asked “Enter passphrase for key” when I’m doing SSH operations
  4. Super User – How to make git not prompt for passphrase for ssh key
  5. Reddit – Git keeps asking for my SSH key passphrase
  6. Reddit – Git push asks for my ssh passphrase every single time
  7. Unix & Linux Stack Exchange – git with ssh keeps asking for passphrase everytime
  8. Unix & Linux Stack Exchange – How to avoid being asked passphrase each time I push to Bitbucket
  9. Ask Ubuntu – Enter SSH passphrase once
  10. Arch Linux Forums – Git keeps asking me for my ssh key passphrase
  11. Apple Stack Exchange – How can I permanently add my SSH private key to Keychain so it is automatically available to ssh?
  12. Super User – Why does macOS keep asking for my SSH passphrase ever since I updated to macOS Sierra (10.12)?
  13. Apple Stack Exchange – How to avoid macOS for keep asking for the passphrase for key ~/.ssh/id_rsa while remotely operating via ssh?
  14. GitHub Docs – Generating a new SSH key and adding it to the ssh-agent
  15. GitHub Docs – Working with SSH key passphrases
  16. GitHub Docs – Error: ssh-add: illegal option – apple-use-keychain

Вывод

Постоянные запросы пароля SSH обычно вызваны неправильной конфигурацией ssh‑agent, проблемами сохранения сессии или интеграцией с keychain на macOS. Самое эффективное решение – правильно настроить ssh‑agent с интеграцией keychain, особенно на macOS, где Apple изменил поведение по умолчанию.

Для устранения проблемы начните с проверки наличия нескольких экземпляров ssh‑agent и убедитесь, что keychain интеграция настроена с помощью ssh-add --apple-use-keychain на современных системах macOS. Настройте ваш ~/.ssh/config с UseKeychain yes и AddKeysToAgent yes для автоматической обработки паролей.

Если проблемы сохраняются, рассмотрите альтернативные подходы, такие как удаление пароля (если безопасность позволяет) или использование перенаправления агента для многошаговых соединений. Правильная настройка ssh‑agent не только избавит от повторных запросов пароля, но и повысит общую эффективность вашего рабочего процесса с Git.

Авторы
Проверено модерацией
Модерация