Как мне сделать, чтобы git использовал ssh-add (когда это необходимо)?

1997
Charlie

В 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?), А не git. В конце концов, это поведение должно быть одинаковым для любого процесса, пытающегося установить ssh-соединения, используя ключи и настройки в ~ / .ssh, включая саму команду ssh.

0

3 ответа на вопрос

4
Chris Johnsen

По умолчанию 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-надстройка ); «константы» нижнего уровня SSH2_AGENTC_ADD_IDENTITYи SSH2_AGENTC_ADD_ID_CONSTRAINEDиспользуются только в authfd.cin ssh-agent.c( ssh-agent ).

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

Спасибо за очень тщательно изученный ответ! Я думаю, что единственная оставшаяся часть вопроса - «Как я могу получить такое поведение в Linux?» Похоже, вы продали дело о том, что этого нельзя сделать с помощью OpenSSH по умолчанию. Я думаю, что лучше всего искать инструменты в среде рабочего стола, например, GNOME и KDE. Charlie 12 лет назад 0
ps Я действительно хотел бы дать этому ответу голосование, но сайт говорит мне, что у меня недостаточно репутации, чтобы сделать это :( Charlie 12 лет назад 0
1
go2null

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

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

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

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

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

AddKeysToAgent yes

0
Charlie

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

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

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

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

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

Похожие вопросы