Проблемы с развертыванием кода с Capistrano с момента обновления до macOS 10.12 (Sierra), "Permission denied (publickey)".

Итак, я просто обновил свой Mac mini (конец 2012 года) до macOS 10.12 (Sierra), и все кажется прекрасным, но Im работает в одной нечетной проблеме, развертывая код с Capistrano. Я получаю следующую ошибку:

Permission denied (publickey).

Никогда не было этой проблемы раньше в Mac OS X 10.11 (El Capitan) или любой версии до нее. Почему это внезапно происходит сейчас? Полный выход неудачного развертывания Capistrano:

jakes_mac:SomeCode jake$ cap staging deploy
INFO [hkdgad21] Running /usr/bin/env mkdir -p /tmp/somecode/ as [email protected]
DEBUG [hkdgad21] Command: /usr/bin/env mkdir -p /tmp/somecode/
[email protected] password:
INFO [hkdgad21] Finished in 5.166 seconds with exit status 0 (successful).
DEBUG Uploading /tmp/somecode/git-ssh.sh 0.0%
INFO Uploading /tmp/somecode/git-ssh.sh 100.0%
INFO [xyz20312] Running /usr/bin/env chmod +x /tmp/somecode/git-ssh.sh as [email protected]
DEBUG [xyz20312] Command: /usr/bin/env chmod +x /tmp/somecode/git-ssh.sh
INFO [xyz20312] Finished in 0.240 seconds with exit status 0 (successful).
INFO [abcdef01] Running /usr/bin/env git ls-remote --heads [email protected]:SomeUser/SomeCode.git as [email protected]
DEBUG [abcdef01] Command: ( GIT_ASKPASS=/bin/echo GIT_SSH=/tmp/somecode/git-ssh.sh /usr/bin/env git ls-remote --heads [email protected]:SomeUser/SomeCode.git )
DEBUG [abcdef01]    Permission denied (publickey).
DEBUG [abcdef01]    fatal: Could not read from remote repository.
DEBUG [abcdef01]
DEBUG [abcdef01]    Please make sure you have the correct access rights
DEBUG [abcdef01]    and the repository exists.
(Backtrace restricted to imported tasks)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as [email protected]: git exit status: 128
git stdout: Nothing written
git stderr: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

SSHKit::Command::Failed: git exit status: 128
git stdout: Nothing written
git stderr: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Tasks: TOP => git:check
(See full trace by running task with --trace)
The deploy has failed with an error: Exception while executing as [email protected]: git exit status: 128
git stdout: Nothing written
git stderr: Permission denied (publickey).
fatal: Could not read from remote repository.

Пожалуйста, убедитесь, что у вас есть правильные права доступа и существует репозиторий.

Ответы

Ответ 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.

Ответ 2

Это ожидаемое поведение от macOS Sierra или что-то связанное с OpenSSH?

Это связано с новой функцией OpenSSH 7.2, которая вызывает изменение поведения со стороны клиента SSH. Из примечания к выпуску:

 ssh(1): Add an AddKeysToAgent client option which can be set to
   'yes', 'no', 'ask', or 'confirm', and defaults to 'no'.  When
   enabled, a private key that is used during authentication will be
   added to ssh-agent if it is running (with confirmation enabled if
   set to 'confirm').

Были и другие интересные (связанные с безопасностью) функции, хотя релиз рассматривался в основном как исправление ошибок. Эта особенность привела к изменению поведения по умолчанию в OS X, так как по умолчанию это значение "нет" и OS X (я не знаю других клиентов) ранее добавляли ключи к агенту по мере их использования.

Итак, если вы добавите следующее в свой ~/.ssh/config файл (или глобальный ssh_config, который должен быть расположен в /etc/ssh/ssh_config), ключи снова будут добавлены к вашему агенту по мере их использования.

AddKeysToAgent yes

Этот однострочный слой делает его довольно простым:

echo "AddKeysToAgent yes" >> ~/.ssh/config

После этого я смог достичь ожидаемого поведения:

$ ssh-add -l
The agent has no identities.
$ ssh -T [email protected] 
logged in as davidalger.

You can use git or hg to connect to Bitbucket. Shell access is disabled.
$ ssh-add -l
2048 SHA256:<snip> (RSA)