Как отключить постоянный запрос пароля 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
- Решения, специфичные для macOS
- Общая настройка ssh‑agent
- Исправления в файле конфигурации SSH
- Дополнительные шаги по устранению неполадок
- Альтернативные решения
Распространённые причины появления запросов пароля 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:
ssh-add --apple-use-keychain ~/.ssh/id_rsa
Если вы получите ошибку «ssh-add: illegal option – apple-use-keychain», используйте полный путь к ssh-add от Apple:
/usr/bin/ssh-add --apple-use-keychain ~/.ssh/id_rsa
Устаревший метод keychain
Для более старых версий macOS или если вышеуказанное не работает, используйте флаг -K (устаревший, но всё ещё функционирующий на некоторых системах):
ssh-add -K ~/.ssh/id_rsa
Как объясняет документация GitHub, опция --apple-use-keychain – это конкретная реализация Apple, которая интегрируется с macOS Keychain Services для хранения и извлечения паролей.
Автоматическая загрузка ключей
Чтобы автоматически загружать ключи при открытии нового терминала, добавьте следующее в ваш профиль оболочки (~/.zshrc, ~/.bash_profile или ~/.bashrc):
# Запускаем 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 критично для избежания повторных запросов пароля. Полный рабочий процесс:
-
Запускаем ssh‑agent в фоновом режиме:
basheval "$(ssh-agent -s)" -
Добавляем ваш SSH‑ключ в агент:
bashssh-add ~/.ssh/id_rsa
-
Проверяем, что ключ добавлен:
bashssh-add -l
Если вы всё ещё видите запрос пароля, попробуйте добавить его с интеграцией keychain:
ssh-add -K ~/.ssh/id_rsa # macOS legacy
ssh-add --apple-use-keychain ~/.ssh/id_rsa # macOS modern
Сохранение сессии
Чтобы сохранить ssh‑agent между сессиями терминала, нужно хранить переменные окружения агента. Создайте скрипт для управления этим:
#!/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:
ps aux | grep ssh-agent
Убейте дублирующие агенты и перезапустите с чистой сессией:
pkill ssh-agent
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
Проверка статуса ssh‑agent
Проверьте, какие ключи сейчас загружены в ваш ssh‑agent:
ssh-add -l
Если ключей нет, добавьте их:
ssh-add ~/.ssh/id_rsa
Тестирование SSH‑соединения
Проверьте ваше SSH‑соединение с GitHub, чтобы убедиться, что проблема с паролем сохраняется:
ssh -vT git@github.com
Обратите внимание на строки, указывающие на успешную аутентификацию или запросы пароля в подробном выводе.
Отладка проблем с keychain
Если вы подозреваете проблемы с keychain, попробуйте удалить и заново добавить ключ:
ssh-add -d ~/.ssh/id_rsa ssh-add ~/.ssh/id_rsa
Для отладки keychain на macOS проверьте, содержит ли ваш keychain пароль SSH:
security find-generic-password -wa "SSH: git@github.com"
Альтернативные решения
Удаление пароля
Если требования безопасности позволяют, вы можете полностью удалить пароль из вашего SSH‑ключа:
ssh-keygen -p
Эта команда запросит текущий пароль и затем позволит оставить поле нового пароля пустым. Как отмечено в обсуждениях Reddit, это самый простой способ, но он снижает уровень безопасности.
Использование перенаправления агента (Agent Forwarding)
Для соединений сервер‑на‑сервер настройте перенаправление агента:
В вашем SSH‑конфиге:
Host github.com
ForwardAgent yes
Это позволит использовать ваш локальный SSH‑агент при подключении через промежуточные серверы.
Использование Pageant на Windows
Если вы используете Windows с Git Bash, рассмотрите возможность использования Pageant (SSH‑агент PuTTY) вместо нативного ssh‑agent:
- Установите PuTTY
- Используйте Pageant для управления вашими SSH‑ключами
- Настройте Git на использование Pageant
Источники
- Stack Overflow – Git keeps asking me for my ssh key passphrase
- Stack Overflow – SSH Key – Still asking for password and passphrase
- Super User – How to avoid being asked “Enter passphrase for key” when I’m doing SSH operations
- Super User – How to make git not prompt for passphrase for ssh key
- Reddit – Git keeps asking for my SSH key passphrase
- Reddit – Git push asks for my ssh passphrase every single time
- Unix & Linux Stack Exchange – git with ssh keeps asking for passphrase everytime
- Unix & Linux Stack Exchange – How to avoid being asked passphrase each time I push to Bitbucket
- Ask Ubuntu – Enter SSH passphrase once
- Arch Linux Forums – Git keeps asking me for my ssh key passphrase
- Apple Stack Exchange – How can I permanently add my SSH private key to Keychain so it is automatically available to ssh?
- Super User – Why does macOS keep asking for my SSH passphrase ever since I updated to macOS Sierra (10.12)?
- Apple Stack Exchange – How to avoid macOS for keep asking for the passphrase for key ~/.ssh/id_rsa while remotely operating via ssh?
- GitHub Docs – Generating a new SSH key and adding it to the ssh-agent
- GitHub Docs – Working with SSH key passphrases
- 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.