Несколько учетных записей GitHub и SSH Config

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

Репозиции, доступные из одной учетной записи, используя [email protected]:accountname

Репозиции, доступные из другого аккаунта с помощью [email protected]:anotheraccount

У каждой учетной записи есть свой SSH-ключ. Оба ключа SSH были добавлены, и я создал файл конфигурации. Я не верю, что файл конфигурации верен. Я не совсем уверен, как указать, что обратное обращение, используя [email protected]:accountname, должно использовать id_rsa, а [email protected]:anotheraccount должно использовать id_rsa_anotheraccount.

Ответ 1

Ответ Энди Лестера верен, но я нашел важный дополнительный шаг, который мне нужно сделать, чтобы заставить его работать. При попытке создать два профиля, один для личного и один для работы, мой ~/.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 использовали правильный профиль. Ранее они по умолчанию были для первого открытого ключа.

Для Не удалось открыть соединение с вашим агентом проверки подлинности при использовании ssh-add,
проверить: fooobar.com/questions/4891/...

Ответ 2

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


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

ssh-keygen -t rsa -C "[email protected]"


Шаг 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 [email protected] (RSA)

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

ssh-add ~/.ssh/id_rsa_work


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

$ ssh -T [email protected]
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T [email protected]
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

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

Ответ 3

Скажем, 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), затем вы также отправились в файл репозитория .git/config, и вы изменили URL-адрес своего удаленного origin, чтобы быть примерно таким:

[remote "origin"]
        url = "ssh://[email protected]/alice/repo1.git"

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

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

, но как насчет второго репозитория?

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

Теперь вы идете и создаете другой ключ (используя ssh-keygen -t rsa -C "[email protected]" без паролей, конечно), и чтобы это не стало беспорядком, вы теперь назовете свои ключи следующим образом:

  • repo1 keypair: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 keypair: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

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

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

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

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

Итак, сначала редактируем файлы .git/config на ваших клонах репо, поэтому они выглядят следующим образом:

Для repo1

[remote "origin"]
        url = "ssh://[email protected]/alice/repo1.git"

Для repo2

[remote "origin"]
        url = "ssh://[email protected]/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 ключ на машину и репо. У вас будет гораздо больше ключей для обработки, но вы будете менее уязвимы, если вы получите компрометацию.

Ответ 4

У меня есть 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 [email protected]:kuchaguangjie/pygtrans.git
    
  • Для репо в Host github-abc:

    git remote set-url origin [email protected]:abcdefg/yyy.git
    

Explaination

Параметры в ~/.ssh/config :

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

    Когда задается удаленный URL для git-репо, это значение, которое следует указывать после [email protected], то есть, как репо отображается на хосте, например, git remote set-url origin [email protected]:kuchaguangjie/pygtrans.git


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

Ответ 5

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

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/github.rsa
    User petdance

Ответ 6

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

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

    ssh-keygen -t rsa -b 4096 -C "[email protected]" -f keyfile

  • Загрузите keyfile.pub поставщику git

  • Запустите ssh-agent на вашем компьютере (вы можете проверить с помощью ps -ef | grep ssh-agent, чтобы узнать, работает ли он уже)
  • Запустите ssh-add .\keyfile, чтобы добавить учетные данные
  • Теперь вы можете запустить git clone [email protected]:username/project.git

Ответ 7

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

  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-add ~/.ssh/proj1.id_rsa
  2. Это то, что я испортил в первый раз - теперь, когда вы хотите клонировать репозиторий proj1, вы делаете это, используя proj1.github.com (именно хост из файла конфигурации). git clone [email protected].

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

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

Ответ 8

Я разместил технику, которую я использую, чтобы справиться с этим здесь

Ответ 9

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

Host github.com
   HostName github.com
   IdentityFile ~/.ssh/github_rsa
   User [email protected]

Это было хорошо.

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

Ответ 10

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

ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "[email protected]"

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

Ответ 11

Возможно, более простой альтернативой редактированию файла конфигурации 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 и условные включения (см. Пример).