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

У меня возникли проблемы с получением двух разных 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,

15 ответов

Решение

Ответ Энди Лестера точен, но я нашел важный дополнительный шаг, который мне нужно было сделать, чтобы это сработало. При попытке настроить два профиля, один для личного и один для работы, мой ~/.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,
проверьте: /questions/23090313/ne-udalos-otkryit-soedinenie-s-vashim-agentom-autentifikatsii/23090347#23090347

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


Шаг 1: SSH ключи
Создайте любые пары ключей, которые вам понадобятся. В этом примере я назвал меня по умолчанию / оригинал '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) в зависимости от того, какой ключ / идентификатор вы хотите использовать. Но теперь тебе должно быть хорошо идти!:)

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

У меня 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 для GitHub,
  • IdentityFile
    укажите ключ для использования, просто укажите путь к открытому ключу,
  • LogLevel
    указать уровень журнала для отладки, если есть какие-либо проблемы, DEBUG3 дает самую подробную информацию.

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

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

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

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

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

В моем случае ни одно из указанных выше решений не решило мою проблему, но 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

Я нахожу решение этой проблемы и пытаюсь его объяснить. Мы должны внести изменения в оба файла~/.ssh/configИ в~/.gitconfig

Давайте покажем.

1. Создайте ключи

Вам понадобится один ключ для каждой учетной записи, которую вы будете использовать на GitHub или BitBucket.

От того, с каким сайтом у вас больше идентификаторов, зависит, сколько ключей вам понадобится.

Один ключ может действовать как ключ GitHub, так и ключ BitBucket, но не может быть связан более чем с одной учетной записью BitBucket или GitHub.

Если вы уже создали ключ в ~/.ssh/id_rsa (расположение по умолчанию), вы можете использовать его вместо ключа ~/.ssh/msmith в моих примерах или оставить этот ключ и добавить дополнительные ключи для другие личности.

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

      $ ssh-keygen -t rsa -b 4096 -f ~/.ssh/key1_rsa -C "msmith@example.com" 

Генерация пары публичных/частных ключей RSA. Введите парольную фразу (пусто, если парольная фраза отсутствует): ************ Введите ту же парольную фразу еще раз: ваши идентификационные данные сохранены в /Users/me/.ssh/key1_rsa. Ваш открытый ключ сохранен в /Users/me/.ssh/key1_rsa.pub. Ключевой отпечаток: ...

      $  ssh-add ~/.ssh/key1_rsa
$  ssh-keygen -t rsa -b 4096 -f ~/.ssh/key2_rsa -C "jblige@example.com" 

Генерация пары публичных/частных ключей RSA. Введите парольную фразу (пусто, если парольная фраза отсутствует): ************ Введите ту же парольную фразу еще раз: ваши идентификационные данные сохранены в /Users/me/.ssh/key2_rsa. Ваш открытый ключ сохранен в /Users/me/.ssh/key2_rsa.pub. Ключевой отпечаток: ...

      $ ssh-add ~/.ssh/key2_rsa

2. Настройка ~/.ssh/config

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

      touch ~/.ssh/config
chmod 600 ~/.ssh/config

Теперь нам нужно добавить конфигурацию SSH, в которой указаны имена хостов github и bitbucket, но с добавленным суффиксом, указывающим, какой ключ использовать. Мы устанавливаем HostName на правильный адрес github.com или bitbucket.org.

Примечание. Пользователи Linux должны либо опустить UseKeychain yes, либо добавить IgnoreUnknown UseKeychain (спасибо Soulofmischief).

      ~/.ssh/config
...

Host github.com-msmith
  HostName github.com
  UseKeychain yes
  AddKeysToAgent yes
  User git
  IdentityFile ~/.ssh/msmith_rsa
  IdentitiesOnly yes

Host bitbucket.org-msmith
  HostName bitbucket.org
  UseKeychain yes
  AddKeysToAgent yes
  User git
  IdentityFile ~/.ssh/msmith_rsa
  IdentitiesOnly yes

Host github.com-jblige
  HostName github.com
  UseKeychain yes
  AddKeysToAgent yes
  User git
  IdentityFile ~/.ssh/jblige_rsa
  IdentitiesOnly yes

Host bitbucket.org-jblige
  HostName bitbucket.org
  UseKeychain yes
  AddKeysToAgent yes
  User git
  IdentityFile ~/.ssh/jblige_rsa
  IdentitiesOnly yes

...

3. Добавьте открытые ключи в GitHub и BitBucket.

Войдите в GitHub для каждого пользователя и добавьте ключи из ~/.ssh/xxxxx.pub к авторизованным SSH-ключам соответствующих пользователей.

Дополнительную информацию об этом см.:https://confluence.atlassian.com/bitbucket/set-up-an-ssh-key-728138079.html .

или

https://help.github.com/en/articles/adding-a-new-ssh-key-to-your-github-account

4. Создайте .gitconfig для конкретного ключа.

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

Я предпочитаю хранить все эти каталоги в одном домашнем каталоге ~/src и называю их в соответствии с именем учетной записи, связанной с ключом.

      mkdir -p ~/src/msmith
mkdir -p ~/src/jblige

В каждый каталог поместите файл .gitconfig.

      ~/src/msmith/.gitconfig
...
[user]
  email = msmith@example.com
    
[url "git@bitbucket.org-msmith"]
  insteadOf = git@bitbucket.org
  
[url "git@github.com-msmith"]
  insteadOf = git@github.com
~/src/jblige/.gitconfig
...
[user]
  email = jblige@example.com
  signingkey = ABCD1234
  
[url "git@bitbucket.org-jblige"]
  insteadOf = git@bitbucket.org
  
[url "git@github.com-jblige"]
  insteadOf = git@github.com
  
[commit]
  gpgsign = true

Таким образом, я использую правильный адрес электронной почты для обоих ключей и даже настроил автоматическое подписание коммитов для jblige. Я также переписываю все имена хостов для исходных соединений SSH на имена хостов с правильными суффиксами, которые я создал в файле конфигурации SSH.

Дополнительную информацию о подписании GPG см.:

https://help.github.com/en/articles/signing-commits

или

https://confluence.atlassian.com/bitbucketserver/using-gpg-keys-913477014.html

5. Настройка конфигурации Git, включая if

Чтобы активировать файлы .gitconfig в ~/src/*, отредактируйте файл .gitconfig в своем домашнем каталоге и добавьте оператор includeif для каждого из файлов .gitconfig, ссылающихся на каталог, в котором они находятся.

      ~/.gitconfig
...

[includeif "gitdir:~/src/msmith/"]
    path = ~/src/msmith/.gitconfig
    
[includeif "gitdir:~/src/jblige/"]
    path = ~/src/jblige/.gitconfig
    

Не забудьте косую черту в конце оператора [includeif "gitdir:...".

6. Клонирование репозиториев

Затем вы клонируете код, используя адрес клонирования SSH (т. е. git@bitbucket.org ... или git@github.com..., а не https://bitbucket.org... или https://github.com...) в каталог, соответствующий ключу, который вы хотите использовать для этого клона.

      $  cd ~/src/msmith
$  git clone git@github.com:someuser/somerepo.git
...

Из-за перезаписи git фактически попытается клонировать, используя суффиксный адрес, соответствующий конфигурации в файле конфигурации SSH, но из-за конфигурации SSH он будет использовать исходное имя хоста при фактическом подключении к хосту, гарантируя, что вы используете правильный ключ.

Все фиксации/извлечения/пересылки в/из этих репозиториев будут использовать соответствующую конфигурацию/ключ/учетную запись.

Самый простой способ использовать несколько учетных записей Git и клонировать их без каких-либо изменений — добавить свое имя пользователя в конфигурацию ssh.

  1. Открыть~/.ssh/config. Создать, если его нет
  2. Добавьте запись хоста следующим образом
      Host github.com:<YOUR_GITHUB_USERNAME>
  AddKeysToAgent yes
  IdentityFile ~/.ssh/<YOUR_SSH_KEY_FILENAME>

Замените <YOUR_GITHUB_USERNAME> желаемым именем пользователя github (личным или рабочим). Замените <YOUR_SSH_KEY_FILENAME> именем вашего ключевого файла в папке .ssh (например: id_ed25519). Добавьте запись хоста для каждой учетной записи github, которую вы хотите поддерживать.

Теперь git clone будет таким же простым, какgit clone github.com:<YOUR_GITHUB_USERNAME>/your-repo.git. Никаких пользовательских доменов gihub, которые нужно помнить при клонировании ;-)

Сделал суть с дополнительной информацией https://gist.github.com/udantha/fed5439630eaf4651272f4fba6e1c6a3

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

Шаг 1: Создайте две пары ключей ssh:

ssh-keygen -t rsa -C "your_email@youremail.com"

Шаг 2: Здесь будут созданы два ключа ssh:

~/.ssh/id_rsa_account1
~/.ssh/id_rsa_account2

Шаг 3: Теперь нам нужно добавить эти ключи:

ssh-add ~/.ssh/id_rsa_account2
ssh-add ~/.ssh/id_rsa_account1
  • Вы можете увидеть список добавленных ключей, используя эту команду: ssh-add -l
  • Вы можете удалить старые кешированные ключи с помощью этой команды: ssh-add -D

Шаг 4. Измените конфигурацию ssh

cd ~/.ssh/
touch config

subl -a config или же code config или же nano config

Шаг 5: Добавьте это в файл конфигурации:

#Github account1
Host github.com-account1
    HostName github.com
    User account1
    IdentityFile ~/.ssh/id_rsa_account1

#Github account2
Host github.com-account2
    HostName github.com
    User account2
    IdentityFile ~/.ssh/id_rsa_account2

Шаг 6. Обновите свой .git/config файл:

Шаг 6.1: Перейдите к проекту account1 и обновите узел:

[remote "origin"]
        url = git@github.com-account1:account1/gfs.git

Если вас пригласил другой пользователь в своем репозитории git. Затем вам нужно обновить хост следующим образом:

[remote "origin"]
            url = git@github.com-account1:invitedByUserName/gfs.git

Шаг 6.2: Перейдите к проекту account2 и обновите хост:

[remote "origin"]
        url = git@github.com-account2:account2/gfs.git

Шаг 7: Обновите имя пользователя и адрес электронной почты для каждого репозитория отдельно, если это необходимо, это не поправочный шаг:

Перейдите к проекту account1 и запустите его:

git config user.name "account1"
git config user.email "account1@domain.com" 

Перейдите к проекту account2 и запустите его:

git config user.name "account2"
git config user.email "acccount2@doamin.com" 

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

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

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

Я использую сценарии оболочки, чтобы переключить меня на любую учетную запись, которую я хочу быть "активной". По сути, вы начинаете с нуля, настраиваете одну учетную запись и работаете правильно, а затем перемещаете эти файлы к имени с соответствующим префиксом. С этого момента вы можете использовать команду "github" или "gitxyz" для переключения:

# my github script
cd ~/.ssh
rm id_rsa
rm id_rsa.pub
rm config

ln git_dhoerl id_rsa
ln git_dhoerl.pub id_rsa.pub
ln config_dhoerl config

git config --global user.email "dhoerl@xyz.com"
git config --global github.user "dhoerl"        
# git config --global github.token "whatever_it_is" # now unused

ssh-add -D

Мне повезло с этим. Я также создал скрипт запуска в XCode (для пользователей Mac), чтобы он не собирал мой проект, если у меня не было правильной настройки (так как он использует git):

Скрипт запуска, размещенный после зависимостей:

#! /bin/ksh
if [ "$(git config --global --get user.email)" != "dhoerl@<company>.com" ]
then
    exit 1
fi

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

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

Хорошо проснулся.

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

Это единственная конфигурация, которая помогла мне использовать две учетные записи GitHub с разными ключами SSH.

Заменятьid_ed25519(представляющий мой рабочий SSH-ключ) иid_ed25519-personal(представляющий мой личный ключ SSH) с именами файлов ваших ключей SSH.

      Host github.com
IdentitiesOnly yes
IdentityFile ~/.ssh/id_ed25519
IdentityFile ~/.ssh/id_ed25519-personal
Другие вопросы по тегам