Несколько учетных записей GitHub и SSH Config
у меня возникли проблемы с получением двух разных SSH-ключей / учетных записей GitHub, чтобы хорошо играть вместе. У меня есть следующая настройка:
РЕПО доступны с одной учетной записи с помощью git@github.com:accountname
РЕПО доступны с другой учетной записи с помощью git@github.com:anotheraccount
каждая учетная запись имеет свой собственный ключ SSH. Как SSH-ключи были добавлены, и я создал файл config. Я не считаю, что файл конфигурации является правильным. Я не совсем уверен, как указать, что РЕПО доступны используя git@github.com:accountname
должны использовать id_rsa
и git@github.com:anotheraccount
должны использовать id_rsa_anotheraccount
.
11 ответов
ответ Энди Лестера точен, но я нашел важный дополнительный шаг, который мне нужно было сделать, чтобы заставить это работать. В попытке получить два профиля, один для личного и один для работы, мой ~/.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 использовали правильный профиль. Ранее они по умолчанию использовали первый открытый ключ.
на не удалось открыть соединение с вашей аутентификацией агент!--10--> при использовании ssh-add
,
Регистрация:
https://stackoverflow.com/a/17695338/1760313
недавно мне пришлось сделать это и пришлось просеять все эти ответы и их комментарии, чтобы в конечном итоге собрать информацию вместе, поэтому я помещу все это здесь, в одном посте, для вашего удобства:
Шаг 1: ssh ключи
Создайте любые пары клавиш, которые вам понадобятся. В этом примере я назвал меня по умолчанию / оригинальным " id_rsa "(который является по умолчанию) и моим новым "id_rsa-work":
ssh-keygen -t rsa -C "stefano@work.com"
Шаг 2: SSH config
Набор до нескольких профилей 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-агентом, вы обнаружили (или вы обнаруживаете сейчас) о ~/.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
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
конфигурация ключей развертывания на github.com, но теперь у вас есть проблема ssh для решения.
как ssh может определить, какой ключ использовать, если репозитории размещаются на том же github.com
домен?
код .ssh/config
file указывает на github.com
и он не знает, какой ключ использовать, когда пришло время, чтобы сделать тягу.
поэтому я нашел трюк с github.com - ... Вы можете сообщить своему ssh-клиенту, что каждый репозиторий живет в другом github.com поддомен, в этих случаях они будут repo1.github.com
и repo2.github.com
Итак, первое, что редактирует .git/config
файлы на ваших клонах РЕПО, поэтому они выглядят так вместо этого:
для repo1
[remote "origin"]
url = "ssh://git@repo1.github.com/alice/repo1.git"
для repo2
[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 ключа на машина и РЕПО. У вас будет намного больше ключей для обработки, но вы будете менее уязвимы, если кто-то будет скомпрометирован.
использовать в своем ~/.ssh/config
:
Host github.com
HostName github.com
IdentityFile ~/.ssh/github.rsa
User petdance
у меня есть 2 аккаунта на github ,и вот что я сделал (на linux
), чтобы заставить его работать.
ключи
- создайте 2 пары ключей rsa, через
ssh-keygen
, назовите их правильно, чтобы облегчить жизнь. - добавить закрытые ключи к локальному Агенту через
ssh-add path_to_private_key
- для каждой учетной записи github загрузите (отдельный) public ключ.
конфигурация
~/.ssh / config
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 для РЕПО:
- для РЕПО в узле
github-kc
:git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
- для РЕПО в узле
github-abc
:git remote set-url origin git@github-abc:abcdefg/yyy.git
объяснение
опции ~/.ssh/config
:
-
Host
github-
Host может быть любым значением, которое может идентифицировать хост и учетную запись, не обязательно быть настоящим хозяином., напримерgithub-kc
определите одну из моих учетных записей на github для моего локального ноутбук,при установке удаленного url-адреса для репозитория git это значение, которое нужно поместить после
git@
, вот как РЕПО сопоставляется с хостом, e.ggit remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
- [следующие суб вариантов
Host
] -
Hostname
укажите фактическое имя хоста, просто используйтеgithub.com
для github, -
User
git
пользователь всегдаgit
для github, -
IdentityFile
укажите ключ для использования, просто укажите путь к открытому ключу, -
LogLevel
укажите уровень журнала для отладки, если возникнут проблемы,DEBUG3
дает наиболее подробную информацию.
в моем случае ни одно из решений выше не решило мою проблему, но ssh-agent делает. В принципе, я сделал следующее:
-
создать пару ключей с помощью ssh-keygen показано ниже. Он будет генерировать пару ключей (в этом примере
.\keyfile
и.\keyfile.pub
)ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile
загрузить
keyfile.pub
поставщику git- запустите ssh-agent на своем компьютере (вы можете проверить с помощью
ps -ef | grep ssh-agent
чтобы увидеть, работает ли он уже) - Run
ssh-add .\keyfile
добавить учетные данные - теперь вы можете запустить
git clone git@provider:username/project.git
Я потратил много времени, чтобы понять все шаги. Итак, давайте опишем шаг за шагом:
- создать новый файл идентификатора с помощью
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 agent
ssh-add ~/.ssh/proj1.id_rsa
- это то, что я испортил в первый раз-теперь, когда вы хотите клонировать РЕПО proj1, вы делаете это с помощью
proj1.github.com
(точно хост из конфигурационного файла).git clone git@proj1.github.com
.
не связывайтесь с хостами
Я,
Host github.com
HostName github.com
IdentityFile ~/.ssh/github_rsa
User abc@gmail.com
Это wokred нормально.
используйте вышеуказанную настройку в своем .файл ssh / config для разных ключей rsa для разных имен пользователей.
в качестве дополнения к ответу @stefano,
Лучше использовать команду -f
при создании нового ключа SSH для другой учетной записи,
ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "your@mail.com"
С id_rsa_work
файл не существует в path ~/.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
возможно, более простой альтернативой редактированию конфигурационного файла ssh (как предложено во всех других ответах) является настройка отдельного репозитория для использования другого (например, нестандартного) ключа ssh.
внутри репозитория, для которого вы хотите использовать другой ключ, выполните команду:
git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount'
и убедитесь, что ваш ключ добавлен в ssh-agent, запустив:
ssh-add ~/.ssh/id_rsa_anotheraccount
имейте в виду, что команда выше добавит ключ только к ssh-агенту для вашего текущего сеанса. Если вы хотите, чтобы это работало, вы должны "постоянно" добавить его в свой ssh-агент. Например, вот как это сделать для ubuntu и здесь OSX.
также должно быть возможно масштабировать этот подход к нескольким репозиториям с использованием глобальной конфигурации git и условного включения (пример).