1

В Linux (CentOS, в случае, если это имеет значение) у меня проблема с командами git. git может использовать преимущества ключей, загруженных в кэш ssh-agent, но если ключи не загружены, он не предпринимает никаких шагов для их загрузки (например, вызова ssh-add).

У меня ~/.ssh/config настроен так:

$ cat ~/.ssh/config 
Host github.com
    User git
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github_id_rsa

В моей системе уже настроен ssh-agent. Я считаю, что он использует реализацию, предоставленную Gnome ( http://live.gnome.org/GnomeKeyring/Ssh ).

Я могу вручную добавить свой ключ github с помощью команды "ssh-add". Когда я это делаю, я вижу, что ключ загружается с помощью «git add -l», а команды git, которые подключаются удаленно (например, "git remote update"), работают без запроса пароля.

Я по-прежнему хочу, чтобы команды git выполняли:

  • По умолчанию, если ssh-agent запущен, а необходимый ключ еще не загружен, используйте ssh-add для загрузки ключа в ssh-agent.

  • Похоже, что ssh-add нужна помощь (через параметр), если файл ключа не является одним из имен файлов по умолчанию (например, «id_rsa», «id_dsa» или «identity»). Это кажется отсталым. У меня есть отображение от имени хоста до IdentityFile, указанного в ~/.ssh/config, как показано выше. Разве ssh-add не сможет это использовать?

Также...

  • Чтобы упростить проблему, я попытался удалить отображение «IdentityFile» из ssh-config и переименовать файлы ключей в имена по умолчанию (id_rsa и id_rsa.pub). Это позволяет «ssh-add» добавлять ключ без каких-либо дополнительных аргументов, но даже в этом упрощенном сценарии я не вижу команд git, добавляющих ключи в кэш ssh-agent.

У меня есть та же самая ~/.ssh/config на моей машине MacOS (Snow Leopard), и она, кажется, делает все правильно. Но как я могу получить такое поведение в Linux? Я не уверен, связано ли это с различием в реализации или конфигурации ssh-agent, ssh-add, git или какой-либо комбинации.

Изменить: Подумав об этом немного больше, я думаю, что это должно иметь гораздо больше общего с инструментами ssh (возможно, самое главное, ssh-agent?) а не мерзавец В конце концов, это поведение должно быть одинаковым для любого процесса, пытающегося установить ssh-соединения, используя ключи и настройки в ~/.ssh, включая саму команду ssh.

3 ответа3

4

По умолчанию OpenSSH просто не делает то, что вы хотите. Программа ssh будет использовать любой ключ, который уже загружен в сконфигурированный агент, но никогда не добавляет ключи к агенту.

Поведение «добавить к агенту любой ключ, защищенный паролем, используемый ssh » связано с изменениями Apple в версии ssh, входящей в комплект Mac OS X.


Типичный прогон ssh будет использовать load_identity_file из sshconnect2.c.

Apple добавляет в load_identity_file вызов keychain_read_passphrase из keychain.c (этот файл полностью поставляется Apple).

keychain_read_passphrase использует ssh_add_identity_constrained из authfd.c для сохранения загруженного ключа в агенте.

Единственный другой пользователь ssh_add_identity_constrained - это ssh-add.c (ssh-add); «константы» нижнего уровня SSH2_AGENTC_ADD_IDENTITY и SSH2_AGENTC_ADD_ID_CONSTRAINED также используются только в authfd.c в ssh-agent.c (ssh-agent).

Таким образом, обычно только ssh-add загружает ключи в агент, но Apple расширяет ssh, чтобы также загружать ключи в агент, когда он запрашивает кодовую фразу ключа в своем графическом интерфейсе.

2

В OpenSSH v7.2 добавлена поддержка AddKeysToAgent .

  • ssh(1): добавить опцию клиента AddKeysToAgent, которую можно установить на
    «да», «нет», «спросить» или «подтвердить», по умолчанию «нет». когда
    включен, закрытый ключ, который используется во время аутентификации
    добавлен в ssh-agent, если он работает (с включенным подтверждением, если
    установить «подтвердить»).

Apple приняла этот стандарт OpenSSH в macOS 10.12.2.

OpenSSH больше не будет загружать ключи в ssh-agent автоматически. Это выравнивает поведение macOS с поведением вышестоящего проекта OpenSSH.

Пользователь может снова включить загрузку ключей в агент, установив эту опцию в файле конфигурации ssh:

AddKeysToAgent yes

0

Краткий ответ: OpenSSH не поддерживает это, но модифицированные версии или альтернативные реализации инструментов, связанных с ssh, могут это сделать.

Более длинный ответ:

OpenSSH не делает этого по причинам, указанным в ответе Криса Джонсена на этой странице. Однако такое поведение можно получить в Linux, используя Gnome Keyring, который предоставляет собственный ssh-agent.

В вопросе, который я написал, я сказал, что я думал, что использую Gnome Keyring (так как я использовал Gnome), но я не был. Я только что установил CentOS 5, и в этой настройке я почти уверен, что запущен демон ssh-agent из OpenSSH.

Я попробовал это снова с Ubuntu 11.04, который определенно использует ssh-агент Gnome Keyring. В этой настройке я получаю искомое поведение в вопросе.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .