GIT выберите закрытый ключ для использования - PullRequest
50 голосов
/ 14 июля 2011

У меня есть 2 сервера Git, которым требуются 2 разных ключа SSH.

git clone user1@server1:blahblahblah использует ~/.ssh/id_rsa, но мне нужно указать, какой ключ использовать в зависимости от сервера, к которому я подключаюсь.

Какой параметр командной строки Git выполняет эту работу? (Я использую Linux)

Ответы [ 7 ]

43 голосов
/ 31 января 2017

Есть еще одна возможность. Это для установки core.sshCommand, например

git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo"

Существует один конкретный сценарий, когда эта стратегия особенно полезна: это когда у вас есть несколько учетных записей на Github, так как все учетные записи ssh для Github имеют git@github.com, и он использует клавишу ssh, чтобы определить, какой пользователь Github вы являетесь. , В этом случае ни .ssh/config, ни ssh-agent не будут делать то, что вы хотите.

Обновление & mdash; Вы не можете запустить вышеупомянутое, пока у вас нет локального хранилища, поэтому, если вы пытаетесь клонировать удаленное хранилище, вам нужно будет указать ключ вручную согласно ответу Гусса:

GIT_SSH_COMMAND="/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" git clone https://github.com/user/repo

После того, как вы клонировали репозиторий, вы можете использовать команду git config для постоянной установки.

33 голосов
/ 14 июля 2011

Если вы подключаетесь через SSH, то ключ будет управляться параметром SSH, а не параметром git.

SSH ищет в файле ~/.ssh/config параметры конфигурации. Измените этот файл и добавьте записи IdentityFile для двух серверов Git следующим образом:

Host server1.whatever.com
  IdentityFile /path/to/key_1
Host server2.whatever.com
  IdentityFile /path/to/key_2

В этой статье есть некоторые подробности.

30 голосов
/ 12 февраля 2016

Как правило, вы хотите использовать ~/.ssh/config для этого. Просто соедините адреса серверов с ключами, которые вы хотите использовать для них, следующим образом:

Host github.com
  IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
  IdentityFile ~/.ssh/id_rsa.heroku
Host *
  IdentityFile ~/.ssh/id_rsa

Host * обозначает любой сервер, поэтому я использую его для установки ~/.ssh/id_rsa в качестве используемого по умолчанию ключа.

16 голосов
/ 08 марта 2017

В моем сценарии, аналогичном сценарию @Richard Smith (чье решение, BTW, у меня не сработало), мне нужно использовать разные ключи для одного и того же сервера в разных репозиториях.

Обходной путь для меня состоял в том, чтобы правильно настроить сеанс с переменной среды GIT_SSH_COMMAND, например:

export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy"

Обновление

Еще одна вещь, на которую следует обратить внимание, это то, что правильная установка переменной окружения может быть затруднительной, поэтому я использую средства изменения командной строки, предоставляемые такими вещами, как Liquid Prompt или Fish Shell подключиться к оболочке и постоянно обновлять переменные окружения в соответствии с текущим каталогом и некоторыми правилами. Например, все мои личные проекты, которым нужен мой личный SSH-ключ с Gitlab, находятся под ~/Documents/Projects/personal, поэтому, когда перехватчик оболочки запускает pwd и обнаруживает, что текущий каталог находится по этому пути, он автоматически устанавливает переменные GIT_SSH_COMMAND как необходимо.

16 голосов
/ 14 октября 2014

Используйте ssh-add path-to-private-key, это работает из коробки.

1 голос
/ 17 июля 2018

впервые (клон) вы можете установить --global, после клонирования вы можете установить --global или --local, если ключ для проекта, я бы выбрал --local

git config --local --add core.sshCommand 'ssh -i ~ / .Ssh / my_key '

0 голосов
/ 11 мая 2019

Пользователь Windows здесь, я только столкнулся с этой проблемой, и у меня есть немного другое решение, чем я читал здесь до сих пор.Проблема, с которой я столкнулся, заключается в том, что я просто хотел клонировать репозиторий, используя определенный закрытый ключ ssh, и не должен был глобально настраивать мой git config или добавлять определенные параметры git bash, как я делаю свою работу в PowerShell.По сути, я просто хочу иметь несколько закрытых ключей в своей папке .ssh и ссылаться на них в определенных репозиториях по мере необходимости.

Для этого работает следующая команда:

git clone -c core.sshCommand="ssh -i ~/.ssh/<PRIVATE KEY NAME>" <CLONE URL>

По сути, при инициализации git-репозитория он устанавливает параметр core.sshCommand перед запуском клона.Таким образом, конкретный ключ ssh, который вы хотите использовать для этого репо, установлен ТОЛЬКО для этого репо.Это может быть не идеальное решение для всех случаев, но для того, что я хочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...