Несколько учетных записей GitHub и настройка SSH - PullRequest
236 голосов
/ 12 июля 2010

У меня возникли проблемы с получением двух разных ключей SSH / учетных записей GitHub для совместной игры.У меня есть следующие настройки:

Репо доступны с одной учетной записи с помощью git@github.com:accountname

Репо доступны с другой учетной записи с помощью git@github.com:anotheraccount

Каждая учетная запись имеет свой собственный ключ SSH.Оба ключа SSH были добавлены, и я создал файл конфигурации.Я не верю, что файл конфигурации правильный.Я не совсем уверен, как указать, что репозитории, к которым обращаются с помощью git@github.com:accountname, должны использовать id_rsa, а git@github.com:anotheraccount должны использовать id_rsa_anotheraccount.

Ответы [ 11 ]

299 голосов
/ 13 декабря 2011

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

Host me.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/me_rsa

Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/work_rsa

Мой рабочий профиль не занимал, пока я не сделал ssh-add ~/.ssh/work_rsa.После этого соединения с github использовали правильный профиль.Ранее они по умолчанию использовали первый открытый ключ.

For Не удалось открыть соединение с вашим агентом аутентификации при использовании ssh-add,
check: https://stackoverflow.com/a/17695338/1760313

162 голосов
/ 18 июня 2013

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


Шаг 1: ssh keys
Создайте любые пары ключей, которые вам понадобятся.В этом примере я назвал меня по умолчанию / оригинал 'id_rsa' (который по умолчанию) и мой новый 'id_rsa-work':

ssh-keygen -t rsa -C "stefano@work.com"


Шаг 2: конфигурация ssh
Настройка нескольких профилей ssh ​​путем создания / изменения ~ / .ssh / config .Обратите внимание на немного отличающиеся значения 'Host':

# Default GitHub
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa

# Work GitHub
Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_work


Шаг 3: ssh-add
Вы можете или не можете делать это.Чтобы проверить, перечислите идентификационные отпечатки пальцев, выполнив:

$ ssh-add -l
2048 1f:1a:b8:69:cd:e3:ee:68:e1:c4:da:d8:96:7c:d0:6f stefano (RSA)
2048 6d:65:b9:3b:ff:9c:5a:54:1c:2f:6a:f7:44:03:84:3f stefano@work.com (RSA)

Если ваших записей там нет, запустите:

ssh-add ~/.ssh/id_rsa_work


Шаг 4: проверка
Чтобы проверить, что вы все сделали правильно, я предлагаю следующую быструю проверку:

$ ssh -T git@github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T git@work.github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

Обратите внимание, что вам придется изменить имя хоста (github / work.github) в зависимости от того, какой ключ/ личность, которую вы хотели бы использовать.Но теперь тебе должно быть хорошо идти!:)

39 голосов
/ 22 октября 2014

Допустим, alice - пользователь github.com с 2 или более закрытыми репозиториями repoN.В этом примере мы будем работать только с двумя репозиториями с именами repo1 и repo2

https://github.com/alice/repo1

https://github.com/alice/repo2

Вам нужно вытащить изэти хранилища без ввода пароля, вероятно, на сервере или на нескольких серверах.Например, вы хотите выполнить git pull origin master и хотите, чтобы это происходило без запроса пароля.

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

Host github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/alice_github.id_rsa
  IdentitiesOnly yes

Итак, вы пошли дальше и создали свой (alice_github.id_rsa, alice_github.id_rsa.pub) keypair, вы также пошли в файл хранилища .git/config и изменили URL своего удаленного origin, чтобы он был примерно таким:

[remote "origin"]
        url = "ssh://git@github.com/alice/repo1.git"

И, наконец, вы пошли в хранилище Settings > Deploy keys раздел и добавил содержимое alice_github.id_rsa.pub

На этом этапе вы могли бы сделать ваш git pull origin master без ввода пароля без проблем.

а как насчет второго хранилища?

Таким образом, ваш инстинкт будет заключаться в том, чтобы захватить этот ключ и добавить его к repo2 ключам Deploy, но github.com выдаст ошибку и скажет, что ключ уже используется.

Теперь выиди и сгенерируй другой ключ (конечно, используя ssh-keygen -t rsa -C "alice@alice.com" без паролей), и, чтобы это не стало беспорядком, теперь ты назовешь свои ключи так:

  • repo1 пара ключей:(repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 пара ключей: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

Теперь вы добавите новый открытый ключ в конфигурацию repo2 Deploy keys на github.com, но теперьу вас есть проблема с ssh.

Как ssh может сказать, какой ключ использовать, если репозитории размещены в одном и том же github.com домене?

Ваш файл .ssh/config указывает на github.com, и он не знает, какойключ, который нужно использовать, когда пришло время сделать это.

Итак, я нашел трюк с github.com.Вы можете сообщить своему SSH-клиенту, что каждый репозиторий находится в отдельном поддомене github.com, в этих случаях они будут repo1.github.com и repo2.github.com

Итак, во-первых, нужно отредактировать файлы .git/config на вашемклоны репо, поэтому они выглядят так:

для репо1

[remote "origin"]
        url = "ssh://git@repo1.github.com/alice/repo1.git"

для репо2

[remote "origin"]
        url = "ssh://git@repo2.github.com/alice/repo2.git"

А затем, в вашем файле .ssh/config, теперь выВы сможете ввести конфигурацию для каждого субдомена:)

Host repo1.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
  IdentitiesOnly yes

Host repo2.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
  IdentitiesOnly yes

Теперь вы можете git pull origin master без ввода паролей из обоих репозиториев.

Если у вас несколько машин, выЯ мог бы скопировать ключи на каждую из машин и использовать их повторно, но я бы посоветовал проделать дополнительную работу, чтобы сгенерировать 1 ключ на машину и выполнить репо.У вас будет намного больше ключей для обработки, но вы будете менее уязвимы, если кто-то будет взломан.

20 голосов
/ 05 ноября 2015

У меня есть 2 аккаунта на github, и вот что я сделал (на linux), чтобы он заработал.

Ключи

  • Создайте 2 пары ключей rsa через ssh-keygen, назовите их правильно, чтобы облегчить жизнь.
  • Добавить личные ключи локальному агенту через ssh-add path_to_private_key
  • Для каждой учетной записи github загрузите (отдельный) открытый ключ.

Конфигурация

~ / .ssh / конфигурации

Host github-kc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_kc.pub
    # LogLevel DEBUG3

Host github-abc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_abc.pub
    # LogLevel DEBUG3

Установить удаленный URL для репо:

  • Для репо в Host github-kc:

    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
    
  • Для репо в Host github-abc:

    git remote set-url origin git@github-abc:abcdefg/yyy.git
    

Explaination

Опции в ~/.ssh/config:

  • Host github-
    Хост может быть любым значением, которое может идентифицировать хост плюс учетную запись, это не должно быть реальным хозяином, например github-kc идентифицируйте один из моих аккаунтов на github для моего локального ноутбук,

    При установке удаленного URL для git-репо это значение, которое следует указывать после git@, то есть, как репо отображается на хосте, например git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git


  • [Ниже приведены дополнительные опции Host]
  • Hostname
    укажите фактическое имя хоста, просто используйте github.com для github,
  • User git
    пользователь всегда git для github,
  • IdentityFile
    укажите ключ для использования, просто укажите путь к открытому ключу,
  • LogLevel
    укажите уровень журнала для отладки, если есть какие-либо проблемы, DEBUG3 дает наиболее подробную информацию.

17 голосов
/ 12 июля 2010

Используйте параметр IdentityFile в вашем ~/.ssh/config:

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/github.rsa
    User petdance
2 голосов
/ 16 сентября 2017

Я потратил много времени, чтобы понять все шаги. Итак, давайте опишем шаг за шагом:

  1. Создайте новый файл идентификации, используя ssh-keygen -t rsa. Дайте ему альтернативу типа proj1.id_rsa и нажмите без сомнения, потому что вам не нужна фраза-пароль.
  2. Добавить новый раздел в .ssh/config:

    Host proj1.github.com
        HostName github.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/proj1.id_rsa
    

Примите во внимание первый раздел и обратите внимание, что proj1.github.com мы вернемся к этому разделу позже.

  1. Добавить идентификатор в ssh agent ssh-add ~/.ssh/proj1.id_rsa
  2. Это то, что я испортил в первый раз - теперь, когда вы хотите клонировать репозиторий proj1, вы делаете это, используя proj1.github.com (именно хост из файла конфигурации). git clone git@proj1.github.com.

Хороший учебник.

Не связывайтесь с хостами

2 голосов
/ 26 января 2016

В моем случае ни одно из приведенных выше решений не решило мою проблему, но ssh-agent делает. По сути, я сделал следующее:

  1. Генерация пары ключей с использованием ssh-keygen, показанного ниже. Он сгенерирует пару ключей (в этом примере .\keyfile и .\keyfile.pub)

    ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile

  2. Загрузка keyfile.pub провайдеру git

  3. Запустите на своей машине ssh-agent (вы можете проверить с помощью ps -ef | grep ssh-agent, чтобы убедиться, что он уже запущен)
  4. Запустите ssh-add .\keyfile, чтобы добавить учетные данные
  5. Теперь вы можете запустить git clone git@provider:username/project.git
1 голос
/ 07 июня 2018

Возможно, более простая альтернатива редактированию файла конфигурации ssh (как предлагается во всех других ответах) - это настроить отдельный репозиторий для использования другого (например, не используемого по умолчанию) ключа ssh.

Внутри хранилища, для которого вы хотите использовать другой ключ, выполните:

git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount'

И убедитесь, что ваш ключ добавлен в ssh-agent, запустив:

ssh-add ~/.ssh/id_rsa_anotheraccount

Имейте в виду, что приведенная выше команда только добавит ключ к ssh-agent для вашего текущего сеанса. Если вы хотите, чтобы это работало вечно, вы должны «навсегда» добавить его в свой ssh-agent. Например, вот как это сделать для Ubuntu и здесь для OSX .

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

1 голос
/ 28 марта 2015

В качестве дополнения к ответу @stefano, лучше использовать команду с -f при создании нового ключа SSH для другой учетной записи,

ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "your@mail.com"

, поскольку файл id_rsa_work несуществует в пути ~/.ssh/, и я создаю этот файл вручную, и он не работает :(

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

Я использовал,

Host github.com
   HostName github.com
   IdentityFile ~/.ssh/github_rsa
   User abc@gmail.com

Он прекрасно работал.

Используйте вышеуказанные настройки в вашем файле .ssh / config для разных ключей rsa для разных имен пользователей.

...