macOS Sierra, похоже, не запоминает ключи SSH между перезагрузками

Я должен запустить эту команду после обновления до macOS:

ssh-add -K

Исправляет проблему после перезагрузки, но мне приходится запускать эту команду каждый раз, когда я вхожу в свой компьютер.

Если я не выполню приведенную выше команду, мои ключи ~/.sshбудут пропущены, и мне будет предложено ввести пароль сервера для установления соединения.

$ ssh-add -Kдает мнеssh-add: illegal option -- K
Вам нужно будет ввести путь к закрытому ключу после -K. См. ответ @JakeGould для решения.
Обновление 10.12.2 избавило меня от некоторых ненужных запросов пароля сервера. Возможно, вам больше не нужно запускать ssh-add -K.
@modius Убедитесь, что вы используете правильную версию ssh-add: это должно быть /usr/bin/ssh-add, а не то, что установлено доморощенным пивом, кондой и т. Д.

Ответы (11)

Начиная с macOS Sierra 10.12.2 Apple добавила ssh_configпараметр, UseKeychainкоторый позволяет «правильное» решение проблемы. Добавьте в свой ~/.ssh/configфайл следующее:

Host *
   AddKeysToAgent yes
   UseKeychain yes     

Со ssh_config manстраницы 10.12.2:

Использоватьбрелок

В macOS указывает, должна ли система искать парольные фразы в цепочке ключей пользователя при попытке использовать определенный ключ. Когда парольная фраза предоставляется пользователем, этот параметр также указывает, следует ли сохранять парольную фразу в связке ключей после проверки ее правильности. Аргумент должен быть «да» или «нет». По умолчанию "нет".

Это хороший совет, но, в конечном счете, он не намного лучше, чем добавление ssh-add -K [path to key]в a, .bash_profileпоскольку оба метода требуют определенного уровня модификации пользователем файлов в учетной записи пользователя, которая никогда не требовалась в прошлом для достижения той же функциональности.
Согласно этой ссылке: openradar.appspot.com/27348363 Apple «перестроила [свое] поведение с основным OpenSSH в этой области».
Абсурдно, что Apple изменила поведение таким образом, что это вызовет проблемы у подавляющего большинства разработчиков (если не из-за GitHub), и ничего никому не сказала!
Я думаю, что IdentityFile ~/.ssh/id_rsaэто избыточно и не нужно (при просмотре параметров по умолчанию). Я никогда не устанавливал эту опцию в своем конфигурационном файле ssh.
Изменение IMO @JakeGould ~/.ssh/config~предпочтительнее, поскольку оно решает проблему на sshуровне. Не уверен на 100%, что .bash_profileмод будет работать для клиентов с графическим интерфейсом, использующих ssh без использования оболочки.
Apple опубликовала техническое примечание TN2449 относительно этого изменения.
Упоминание id_rsaв этом ответе сбивает с толку.
@commonpike @therealmarv Я удалил этот IdentityFileвариант из ответа, так как он не требуется.
Также работает на 10.13
Как я уже упоминал на apple.stackexchange.com/questions/48502/… : Apple рекомендует использовать IgnoreUnknown UseKeychainдля кросс-совместимости с Linux
Некоторые из основных причин, по которым добавление UseKeychain yesв файл .ssh/config каждого ключа является лучшим методом, чем использование ssh-add: 1. Это поддерживается и рекомендуется. 2. Он не полагается на оболочку, как добавление в .bash_profileбы. 3. Позволяет не добавлять парольную фразу для особо секретного ключа автоматически. 4. Если вы добавите новый ключ, вам, вероятно, все равно придется отредактировать configфайл, чтобы вы могли делать все в одном месте.
Приводит ли настройка UseKeychain yesк сохранению парольной фразы при перезагрузке (т.е. к записи на диск)? Если да, то есть ли способ предотвратить это? Я не вижу смысла сохранять кодовую фразу SSH в потенциально менее безопасном месте.
@intuited фраза-пароль сохраняется на диск в цепочке ключей пользователя (вот что UseKeychain yesзначит). Связки ключей macOS надежно зашифрованы. Если вы не хотите, чтобы они сохранялись в цепочке для ключей, установите для этого параметра значение «нет», но тогда, очевидно, парольные фразы не сохраняются при перезагрузке, о чем и идет речь в этом вопросе.
Файла конфигурации даже не было для меня. пришлось самому добавить
Предыдущая Host *строка не нужна. Любые параметры, не входящие в категорию a Host, будут считаться глобальными конфигурациями.

У меня также была эта проблема при попытке развернуть некоторый код с помощью Capistrano . Очень расстраивает. Вот два известных мне метода решения этой проблемы.

Способ 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-ключ/идентификатор, который у вас есть, к агенту, даже если в этом нет необходимости; например, в случае ящиков Vagrant.

Мое решение после долгих испытаний было следующим.

Во-первых, если к вашему агенту добавлено больше SSH-ключей/удостоверений, чем вам нужно, как показано, ssh-add -lудалите их все из агента следующим образом:

ssh-add -D

После этого запустите агент SSH в качестве фонового процесса следующим образом:

eval "$(ssh-agent -s)"

Теперь это становится странным, и я не слишком уверен, почему. В некоторых случаях вы можете специально добавить ~/.ssh/id_rsaключ/удостоверение к агенту следующим образом:

ssh-add ~/.ssh/id_rsa

Введите парольную фразу, нажмите, Returnи все готово.

Но в других случаях достаточно просто запустить это, чтобы добавить ключ/идентификацию:

ssh-add -K

Если это все сработало, введите, ssh-add -lи вы должны увидеть один одинокий ключ / идентификатор SSH в списке.

Все хорошо? Теперь откройте свой .bash_profile:

nano ~/.bash_profile

И добавьте эту строку внизу; прокомментируйте или удалите -Aверсию, если она у вас есть:

ssh-add -K 2>/dev/null;

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

ОБНОВЛЕНИЕ: Apple теперь добавила UseKeychainопцию в открытые параметры конфигурации SSH и также рассматривает ssh-add -Aрешение.

Начиная с macOS Sierra 10.12.2, Apple добавила UseKeychainпараметр конфигурации для конфигураций SSH. Проверка справочной страницы (через man ssh_config) показывает следующую информацию:

UseKeychain
        On macOS, specifies whether the system should search for
        passphrases in the user's 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 , как описано в этом билете Open Radar , либо как добавление UseKeychainв качестве одного из вариантов для каждого пользователя ~/.ssh/config.

Не работает для меня; но у меня есть кодовая фраза на ключе.
@modius: если у вас есть защищенный ключ pw, сделайте ssh-add -K [path to key]и введите pw при появлении запроса. Связка ключей будет хранить пароль, и после этого ssh-add получит его оттуда.
Обратите внимание, что -A предназначен для добавления удостоверений к агенту с использованием любых парольных фраз, хранящихся в вашей цепочке ключей. Если у вас дополнительно есть удостоверения без фраз-паролей, вам нужно будет опустить параметр -A, чтобы добавить их к вашему агенту.
Просто чтобы добавить немного больше наглядности, Apple обновила справочную страницу для ssh_config, чтобы включить UseKeychainи AddKeysToAgentавтоматически добавить ваши ключи из вашего ssh_config. Нет необходимости в сценариях оболочки. Смотрите ответ @mluisbrown ниже для получения обновленной информации для 10.12.2.
@RyanGibbons «Сценарии оболочки не требуются». Это хороший совет, но если есть выбор между редактированием ~/.ssh/configконфигурации для добавления 4 строк конфигурации и добавлением одной строки ssh-add -K [path to key]в файл .bash_profile, ни одно из решений не будет идеальным. Идеальным сценарием является обновление до macOS 10.12.2, которое устранит необходимость вносить какие- либо изменения в любую конфигурацию вручную для достижения этой базовой — и ожидаемой — функциональности.
@JakeGould Я понимаю, о чем вы говорите, мне действительно нравится то, что они делают. Вместо автоматического сохранения парольной фразы в связке ключей и загрузки ее при загрузке они дают вам контроль над вашей безопасностью. / пожимает плечами
@RyanGibbons FWIW, посмотрите на официальное предложение отдела по связям с разработчиками Apple в этом ответе на OpenRadar: «Вы можете довольно легко исправить это, запустив ssh-add -Aсвой rc-скрипт, если хотите, чтобы ваши ключи всегда загружались». ¯\_(ツ)_/¯
LOL, спасибо за это - поэтому они добавляют параметры ssh_config для автоматической обработки, но не рекомендуют их использовать.
стоит отметить, что опция UseKeychain не работает, если вы используете ssh, установленный с доморощенным
ssh-add -Aне работает в Мохаве (10.14.6 (18G4032)), со свежим ssh-add (/usr/local/Cellar/openssh/8.3p1/bin/ssh-add). Похоже, он работает с этими двумя (используя свежий ssh-add): ssh-add -K ~/.ssh/id_rsaтогдаssh-add ~/.ssh/id_rsa
Еще один комментарий: убедитесь, что вы используете, /usr/bin/ssh-addа не что-то, установленное доморощенным пивом, кондой и т. Д. (Проверьте which ssh-add, чтобы быть уверенным.)

Как объясняется здесь , это рекомендуемый метод, начиная с macOS 10.12.2 :

  1. Добавьте следующие строки в ваш ~/.ssh/configфайл:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. Любой ключ, который вы добавите в ssh-агент с помощью ssh-add /path/to/your/private/key/id_rsaкоманды, будет автоматически добавлен в цепочку для ключей и должен автоматически загружаться при перезагрузке.


Я добавляю этот ответ, потому что:

  • Другие ответы говорят вам добавить IdentityFile ~/.ssh/id_rsaстроку, но эта опция не нужна для автоматической загрузки ключей (и она фактически привязывает этот конкретный ключ к разделу хоста, в который вы его добавляете, что вам не понадобится, если вы используете разные ключи для разные хот-доги).
  • В принятом ответе упоминается UseKeychain, но этого недостаточно, чтобы сохранить ключи ssh-agentпосле перезагрузки.
Касательно второго пункта. Насколько вы уверены? На самом деле ничего не происходит при перезагрузке, и это также не упоминается в вашем справочном материале. Что происходит с приведенной выше конфигурацией, так это то, что ваш SSH-клиент загрузит ключ в агент при первом подключении (и он также получит парольную фразу из цепочки для ключей), после чего ключ останется загруженным. Вы можете проверить это утверждение, перечислив ключи сразу после перезагрузки через ssh-add -Lи он сообщит The agent has no identities. Ничего не будет там, пока вы не подключитесь. Ключи AddKeysToAgentникак не сохраняются между перезагрузками!

Я написал небольшой пост на эту тему , который может вам помочь.

Решение вызывает ssh-add -Aкоманду при каждом запуске.

Просто добавьте .plistфайл со следующим содержимым в путь ~/Library/LaunchAgents/или создайте его с помощью приложения Lingon :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>ssh-add-a</string>
    <key>ProgramArguments</key>
    <array>
        <string>ssh-add</string>
        <string>-A</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

<!-- @@@@LingonWhatStart:ssh-add -A@@@@LingonWhatEnd -->

Начиная с macOS 10.12.2 вы можете использовать эту UseKeychainопцию. Подробнее читайте здесь или загляните в man ssh_config.

     UseKeychain
         On macOS, specifies whether the system should search for passphrases in the user's keychain
         when attempting to use a particular 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''.

Поэтому просто сделайте следующее:

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

Использование >>подвергается риску, если вы вводите команду несколько раз. Лучше сделать ручную редакцию файла, как описано в ответе mluisbrown или ответе ChrisJF .
Вы правы :-)

У меня была эта проблема раньше, и я нашел способ обойти это. Я только что создал файл с именем configв моей ~/.sshпапке, куда я добавил следующие строки:

Host github.com
HostName github.com
IdentityFile ~/.ssh/github
IdentitiesOnly yes

Я не уверен, почему, но Hostоба HostNameважны. В моем случае, если одного из них не было, решение не сработало.

Затем я просто сделал это, ssh-add -Kи он работал даже после перезагрузки.

Хост — это ваше определяемое пользователем имя/псевдоним для определенного сервера, и он разграничивает записи для каждого сервера: стилистически хорошо делать отступы для строк, следующих за записью Хост. HostName указывает сетевое имя сервера, например github.com, но вы также можете использовать IP-адрес. Host и HostName не обязательно должны быть одним и тем же, но да, они оба являются неотъемлемой частью формата конфигурации ssh.

Если вы используете другую версию ssh (например, установленную через homebrew), приведенные выше решения не будут работать из коробки. Например, AddKeysToAgent yesи UseKeychain yesв .ssh/configфайле не распознаются версиями ssh, отличными от Apple, и это вызовет ошибку. То же самое для опции -Aили для клиента.-Kssh

Это означает , что ответ @mluisbrown вообще не сработает. Вы можете использовать метод 1 ответа @Giacomo1968 и явно использовать ssh-addутилиту macOS .bash_profileдля добавления всех ключей в цепочку для ключей, то есть:

/usr/bin/ssh-add -A

Как упоминалось в комментарии выше , вам может потребоваться сначала добавить ключ в цепочку для ключей: например/usr/bin/ssh-add -K .ssh/github

Я обнаружил, что ssh-add -Kмне дали " незаконный вариант -- К ". Это было связано с тем, что ssh-add был странной версией из /usr/local/bin (устанавливался brew?). Я смог добавить ключ, специально используя ssh-add, расположенный в /usr/bin:

/usr/bin/ssh-add -K ~/.ssh/id_rsa
это то, что сработало для меня после того, как я не мог легко работать целую вечность.

Изменение ~/.ssh/config для добавления UseKeyChain для всех хостов достаточно, чтобы остановить этот повторяющийся кошмар;)

Host *
 UseKeychain yes

Если файл пуст или не существует, просто создайте и/или добавьте указанную выше конфигурацию.

Я обновился до Mac OS X Sierra (10.12.6). Я мог подключиться по ssh к другим хостам, но не к github.com.

Вот что мне пришлось вставить в ~/.ssh/config:

PubkeyAcceptedKeyTypes ssh-dss,ssh-rsa

После этого изменения я мог использовать github, как и раньше.

Ответ на аналогичный вопрос есть в этой ветке на Askubuntu. Я нашел отличное решение для этого, добавив плагин для оболочки oh-my-zsh, на который я переключился с bash.