2016-05-30 3 views
5

У меня есть ключи SSH на месте, внутри ~/.ssh. Многие из них на самом деле. Поэтому мне интересно, как git знает, какой из них следует предпринять, когда он пытается подключиться к репозиторию через конечную точку [email protected]:group/repo.git?Как git знает, какой ключ ssh использовать для своих операций?

ответ

9

Git не знает или не заботится. Он просто запускает ssh.

Как знать ssh? Он смотрит на свой ~/.ssh/config файл (редактировать: или получает его от SSH-агента, смотрите ниже):

Host github.com 
    # IdentitiesOnly yes # see below to decide if you want this 
    IdentityFile ~/.ssh/github_id_file 

Host domain.com 
    IdentitiesOnly yes # again, see below 
    IdentityFile ~/.ssh/another_id_file 

Edit: вот ссылка на a Linux version of the ssh_config documentation. Хотя каждая система (MacOS, Linux, различные BSD, даже порты Windows) имеет свой собственный вкус конфигурации ssh, все они разделяют большинство этих конфигураций. Обратите внимание, эти два элемента, в частности (я скорректировали форматирование немного для StackOverflow уценки):

IdentitiesOnly

            Указывает, что SSH (1) следует использовать только в идентификатор аутентификации файлы сконфигурированы в файлах ssh_config, даже если ssh-agent (1) или a PKCS11Provider предлагает больше идентификационных данных. Аргументом к этому ключевому слову должно быть «да» или «нет». Этот параметр предназначен для ситуаций, когда ssh-agent предлагает множество разных идентификаторов. Значение по умолчанию «нет» - .

IdentityFile

            Определяет файл, из которого считывается удостоверение подлинности DSA, ECDSA, ED25519 или RSA пользователя. По умолчанию ~/.ssh/identity для протокола версии 1, и ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 и ~/.ssh/id_rsa для протокола версии 2. Кроме того, любые тождества, представленные агентом аутентификации будет использоваться для проверки подлинности, если IdentitiesOnly не множество. ssh (1) попытается загрузить информацию сертификата из файла , полученного путем добавления -cert.pub к пути , указанному IdentityFile.

            Имя файла может использовать тильды синтаксиса для обозначения домашнего каталога пользователя или один из следующих символов эвакуационных: «% d» (местный домашнего каталога пользователя), «% и» (локальное имя пользователя), «% l» (локальный хост ), «% h» (имя удаленного хоста) или «% r» (имя удаленного пользователя).

            Можно иметь несколько файлов удостоверений, указанных в файлах конфигурации; все эти тождества будут проверяться последовательно. Несколько Указатели IdentityFile добавят к списку идентификаторов (это поведение отличается от других настроек ).

            IdentityFile может быть использован в сочетании с IdentitiesOnly, чтобы выбрать, какие тождества в качестве агента предлагаются во время аутентификации.

В Alexey Ten noted in a comment, IdentityFile свойствен тем, что она является аддитивной (а не один-настройка-переопределяет-другой).

Вы также можете запустить ssh (вручную) с дополнительными параметрами -v для отслеживания соединения. В Git вы можете установить GIT_SSH на имя сценария, который запускает ssh -vvv для временной трассировки (или суеты с уровнем журнала в вашем файле ~/.ssh/config). Я нашел это полезным для отладки. (Обратите внимание, что вы не можете передать параметры SSH через GIT_SSH, вам нужен скрипт один строки, такие как ssh-vvv с одной линии чтения ssh -vvv [email protected].)

+1

И в случае, если у вас нет явного отображения, SSH просто пытается их все –

+0

I похоже, нет файла ~/.ssh/config. Если вы обновите свой ответ на случай и, возможно, ссылку на ресурс о том, как создать такой файл (который, как я вижу, мне нужен), я соглашусь с этим. – jayarjo

+0

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

Смежные вопросы