Несколько учетных записей 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
Я потратил много времени, чтобы понять все шаги. Итак, давайте опишем шаг за шагом:
- Создайте новый файл идентификации, используя
ssh-keygen -t rsa
. Дайте ему альтернативу, такую как proj1.id_rsa
и нажмите без сомнения, потому что вам не нужна фраза-пароль. -
Добавить новый раздел в .ssh/config
:
Host proj1.github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/proj1.id_rsa
Примите во внимание первый раздел и обратите внимание, что proj1.github.com
мы вернемся к разделу позже.
- Добавьте личность к агенту
ssh-add ~/.ssh/proj1.id_rsa
- Это то, что я испортил в первый раз - теперь, когда вы хотите клонировать репозиторий 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 и условные включения (см. Пример).