Ответ 1
Кажется, что проблема связана с тем, что ключи SSH не добавляются автоматически, как это было в Mac OS X 10.11 (El Capitan). Это ожидаемое поведение от macOS Sierra или что-то связанное с OpenSSH?
Способ 1. Добавьте все известные ключи к агенту SSH.
Итак, я нашел решение: ssh-add
с опцией -A
, которая добавляет все известные идентификаторы к агенту SSH, используя любые парольные фразы, хранящиеся в вашей цепочке ключей, например:
ssh-add -A
Теперь это работает, но оно не будет сохраняться при перезагрузках. Поэтому, если вы хотите больше не беспокоиться об этом, просто откройте свой файл ~/.bash_profile
для пользователей следующим образом:
nano ~/.bash_profile
И добавьте эту строку в конец:
ssh-add -A 2>/dev/null;
Теперь, когда вы открываете новое окно терминала, все должно быть хорошо!
Способ 2. Добавьте только ключи SSH, которые находятся в цепочке ключей к агенту.
Поэтому, когда параметр ssh-add -A
должен работать для большинства основных случаев, я столкнулся с проблемой в последнее время, когда у меня было 6-7 бранных коробок (которые используют SSH-ключи/идентификаторы для доступа) на машине поверх других общий id_rsa.pub
на месте.
Короче говоря, я оказался заблокированным из удаленного сервера из-за слишком многих неудачных попыток на основе SSH-ключей/идентификаторов, поскольку доступ к серверу был основан на пароле, а ключи/идентификаторы SSH - это SSH-ключи/идентификаторы. Итак, агент SSH попробовал все мои SSH-ключи, не удалось, и я даже не смог получить приглашение пароля.
Проблема заключается в том, что ssh-add -A
будет просто произвольно добавлять каждый отдельный ключ/идентификатор SSH, который у вас есть, даже если это не нужно делать; например, в случае бродячих коробок.
Мое решение после долгих испытаний было следующим.
Во-первых, если у вас есть больше ключей/удостоверений SSH, добавленных в ваш агент, чем вам нужно - как показано в ssh-add -l
, то очистите их все от агента следующим образом:
ssh-add -D
После этого запустите агент SSH как фоновый процесс следующим образом:
eval "$(ssh-agent -s)"
Теперь это становится странным, и я не уверен, почему. В некоторых случаях вы можете специально добавить ключ/идентификатор ~/.ssh/id_rsa.pub
для агента следующим образом:
ssh-add ~/.ssh/id_rsa.pub
Введите свою кодовую фразу, нажмите Return, и вам должно быть хорошо идти.
Но в других случаях просто запустить это достаточно, чтобы получить добавленный ключ/идентификатор:
ssh-add -K
Если все это сработало, введите ssh-add -l
и вы увидите один одиночный ключ/идентификатор SSH.
Все хорошо? Теперь откройте свой .bash_profile
:
nano ~/.bash_profile
И добавьте эту строку в нижнюю; комментарий или удалить версию -A
, если у вас это есть:
ssh-add -K
Это позволит перезагрузить SSH-ключ/идентификатор агента SSH при каждом запуске/перезагрузке.
ОБНОВЛЕНИЕ 1: Основываясь на ответе davidalger, я обнаружил более приятное глобальное решение, которое может работать всех пользователей в системе. Просто откройте глобальную конфигурацию SSH, расположенную здесь, через sudo
:
sudo nano /etc/ssh/ssh_config
И добавьте эту строку в конец файла:
AddKeysToAgent yes
Сделал это после удаления исправления .bash_profile
и все тоже хорошо.
ОБНОВЛЕНИЕ 2: Apple теперь добавила опцию UseKeychain
для открытых опций конфигурации SSH и также рассматривает ssh-add -A
решение.
Как и в macOS Sierra 10.12.2, Apple (предположим) добавила опцию UseKeychain
config для конфигураций SSH. Проверка справочной страницы (через man ssh_config
) показывает следующую информацию:
UseKeychain
On macOS, specifies whether the system should search for
passphrases in the user keychain when attempting to use a par-
ticular key. When the passphrase is provided by the user, this
option also specifies whether the passphrase should be stored
into the keychain once it has been verified to be correct. The
argument must be ``yes'' or ``no''. The default is ``no''.
Что сводится к тому, что Apple увидит решение как добавив ssh-add -A
к вашему .bash_profile
как описано в этом открывшемся билете Radar или добавлении UseKeychain
как один из вариантов для пользователя ~/.ssh/config
.