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

249

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

radesix
источник
Я нашел эту ссылку полезной medium.freecodecamp.org/…
jgreen
У меня есть 3 отдельных идентификатора SSH в ~ / .ssh / config. Один для школьного сервера имеет код доступа; 2 для отдельной работы / личных действий GitHub - нет. Запуск git pullпродолжал давать сбои и запрашивать пароль школы, несмотря на отдельные файлы Identity, «IdentitiesOnly = yes», отдельные домены и имена хостов, все присутствующие в ssh-add -l... Ключ uni был «первым» независимо от этой настройки. Пришлось переместить его раздел ниже других в .ssh / config, и теперь git pullс обоих действий GitHub успешно без запроса пароля uni ssh.
mc01

Ответы:

309

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

Джим Врубель
источник
39
Спасибо! - это ssh-addто, чего мне не хватало.
мудрец
Используя ssh-add, я мог видеть, что у меня не были правильно настроены права доступа к файлу для ключа. Однажды я установил, что все работает. Так что спасибо!
phatmann
6
Смотрите также doblock.com/articles/… . Ключевая новая информация заключается в том, что вам может потребоваться добавить имя пользователя (в данном примере «work») к имени хоста в удаленном URL, то есть git@work.github.com: work / my_repo.git (as в отличие от "git@github.com ...")
BobS
Это работает: superuser.com/questions/232373/…
Кейси
15
Чтобы исправить проблему, что «они по умолчанию использовали первый открытый ключ», добавьте IdentitiesOnly yesв Host *раздел вашего ~/.ssh/configфайла. Это заставляет ssh фактически использовать указанные вами IdentityFiles вместо того, чтобы рассылать на сервер все эти сообщения.
Механическая улитка
172

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


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

Stefano
источник
1
Это отличный ответ. Мне пришлось использовать ssh-add, чтобы добавить оба ключа ssh для использования файла конфигурации. Спасибо :)
gaurav.singharoy
Единственное, что я хотел бы добавить, это когда вы запускаете ssh-keygen -t rsa, это даст вам имя файла по умолчанию, где вы и введете свое имя файла.
Донато
Один из лучших ответов. Также это видео помогло мне. youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
TestingWithArif
Хороший пост, было бы неплохо, если бы этот пост включал настройку вашего git config 'email': help.github.com/articles/…
Dave Engineer
43

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

Gubatron
источник
1
Указание субдомена, который соответствует хосту, .ssh/configявляется решающим шагом - большое спасибо за это
Майк Миллер
22

У меня есть 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:

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

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


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

Эрик Ван
источник
Прекрасно - не нужно ssh-add path_to_private_key- вероятно, потому что агент не требуется в этом случае. Файл конфигурации явно определяет путь к ключам.
Марк Чакериан
2
@MarkChackerian Я думаю, что вам не нужно, ssh-addпотому что ваши ключи не защищены паролем или (если вы на Mac) брелок OSX обрабатывает это для вас. ssh-addпредотвращает необходимость ввода пароля при каждом доступе к ключам.
Ашхар Хасан
18

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

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/github.rsa
    User petdance
Энди Лестер
источник
Спасибо, но это не совсем точно. Я нашел ответ и поделился ниже.
radesix
Я уверен, что мой подход будет работать в вашем случае. Вы можете идентифицировать разных пользователей и разные файлы идентификации. Просто нужно указать каждому параметру Host в разделе конфигурации.
Энди Лестер
1
Энди, по ссылке, которую я нашел ниже, мне нужно было удалить .com с хоста. Как только я это сделал, все заработало нормально.
radesix
5

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

Якуб Кукул
источник
4

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

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

  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,

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

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

I159
источник
Спасибо за ссылку на турориал! У вас есть опечатка: имена ключей id_rsa_proj1и на proj1_id_rsaсамом деле должны быть одинаковыми. Вы также можете добавить часть о .git/configнастройках из учебника к своему ответу.
Цезарь
У вас все еще есть опечатка: proj1.id_rsaпротивproj1_id_rsa
Цезарь
2

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

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

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

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

Джоти Пракаш
источник
2

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

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

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

li2
источник
2

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

Дэвид Х
источник