Кілька облікових записів 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.


Я вважаю це посилання корисним medium.freecodecamp.org/…
jgreen

У мене є 3 окремі ідентичності SSH у ~ / .ssh / config. У сервера для школи є пароль; 2 для окремих робіт / особистих дій GitHub не відповідають. Пробіг git pullне вдавався і запитував шкільний пароль, незважаючи на окремі файли посвідчень, "IdentitiesOnly = так", окремі домени та імена хостів, всі присутні в ssh-add -l... Ключ uni був "перший" незалежно від налаштування. Довелося перемістити свій розділ нижче інших в .ssh / config, і тепер git pullз обох актів GitHub вдається успішно запитувати пароль uni uni.
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/… . Основна нова інформація там полягає в тому, що вам може знадобитися додати ім’я користувача ("робота", у цьому прикладі) до імені хоста у віддаленій URL-адресі, тобто git@work.github.com: work / my_repo.git (як проти "git@github.com ...")
BobS


15
Щоб усунути проблему, що "вони дефолтували до першого відкритого ключа", додайте IdentitiesOnly yesдо Host *розділу вашого ~/.ssh/configфайлу. Це говорить ssh фактично використовувати вказані вами IdentityFiles, а не спамувати сервер з усіма ними.
Механічний равлик

172

Нещодавно мені довелося це зробити, і мені довелося просіяти всі ці відповіді та їх коментарі, щоб врешті-решт зібрати інформацію разом, тому я викладу її тут, в одному дописі, для вашої зручності:


Крок 1: клавіші ssh
Створіть потрібні вам клавіші . У цьому прикладі я назвав мене за замовчуванням / оригіналом 'id_rsa' (який є типовим) та моїм новим 'id_rsa-work':

ssh-keygen -t rsa -C "stefano@work.com"


Крок 2: ssh config
Налаштування декількох ssh-профілів, створюючи / змінюючи ~ / .ssh / config . Зверніть увагу на дещо інші значення "Хост":

# 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) залежно від того, який ключ / особу ви хочете використовувати. Але тепер вам слід добре піти! :)


1
Це чудова відповідь. Мені довелося використовувати ssh-add, щоб додати обидві клавіші ssh, щоб використовувати конфігураційний файл .. Дякую :)
gaurav.singharoy

Єдине, що я хотів би додати, це коли ви запускаєте ssh-keygen -t rsa, він дасть вам ім'я файлу за замовчуванням, саме там ви вводите власне ім’я файлу.
Донато

Одна з найкращих відповідей. Також це відео допомогло мені. youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
ТестуванняWithArif

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


1
Визначення субдомену, який відповідає хосту, .ssh/configє найважливішим кроком - велике спасибі за це
Майк Міллер

22

У мене є 2 акаунти на github, і ось що я зробив (на linux), щоб він працював.

Ключі

  • Створіть дві пари клавіш rsa, через ssh-keygen, назвіть їх належним чином, щоб полегшити життя.
  • Додайте приватні ключі до місцевого агента через ssh-add path_to_private_key
  • Для кожного облікового запису github завантажте відкритий ключ.

Конфігурація

~ / .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:

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

    Коли ви встановлюєте віддалений URL для git repo, це значення, яке слід застосувати після 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

Я майже впевнений, що мій підхід спрацює у вашому випадку. Ви можете ідентифікувати різних користувачів та різні файли посвідчень. Просто потрібно надати кожному різний параметр хосту на конфігураційній строфі.
Енді Лестер

1
Енді, за посиланням, яке я знайшов нижче, мені потрібно було скинути .com з хоста. Колись я це зробив, це справно працювало.
radesix

5

Можливо, простішою альтернативою редагування файлу налаштування ssh (як це пропонується у всіх інших відповідях) є налаштування окремого сховища для використання іншого (наприклад, не за замовчуванням) ключа ssh.

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

git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount'

І переконайтеся, що ваш ключ додається до ssh-агента, запустивши:

ssh-add ~/.ssh/id_rsa_anotheraccount

Майте на увазі, що команда вище додасть ключ до ssh-агента для вашого поточного сеансу. Якщо ви хочете, щоб це працювало назавжди, вам доведеться "назавжди" додати його до свого ssh-агента. Наприклад, ось як це зробити для ubuntu і тут для OSX .

Слід також мати можливість масштабувати цей підхід до декількох сховищ, використовуючи глобальну конфігурацію git і умовно включає ( див. Приклад ).


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-агент на своїй машині (ви можете перевірити ps -ef | grep ssh-agent чи працює він уже)
  4. Біжи ssh-add .\keyfile додавання облікових даних
  5. Тепер ви можете бігти git clone git@provider:username/project.git

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. Це те, що я заплутався вперше - тепер, коли ви хочете клонувати rej1 rej1, ви робите це за допомогою proj1.github.com(саме хоста з конфігураційного файлу). git clone git@proj1.github.com.

Хороший підручник.

Не возитися з господарями


Дякуємо за посилання на turorial! У вас помилка друку: назви ключів id_rsa_proj1і proj1_id_rsaнасправді повинні бути однаковими. Ви також можете додати у відповідь частину про .git/configналаштування з підручника.
cezar

У вас ще є помилка proj1.id_rsaproj1_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/, і я створюю цей файл вручну, і він не працює :(


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.