Birden Çok GitHub Hesabı ve SSH Yapılandırması


249

Birlikte iyi oynamak için iki farklı SSH anahtarı / GitHub hesabı almakta sorun yaşıyorum. Aşağıdaki kurulum var:

Kullanarak bir hesaptan erişilebilen depolar git@github.com:accountname

Kullanarak başka bir hesaptan erişilebilen depolara git@github.com:anotheraccount

Her hesabın kendi SSH anahtarı vardır. Her iki SSH anahtarı eklendi ve bir yapılandırma dosyası oluşturdum. Ben yapılandırma dosyasının doğru olduğuna inanmıyorum. Pek emin repo ile erişebilecekleri belirtmek nasıl değilim git@github.com:accountnamekullanmalıdır id_rsave git@github.com:anotheraccountkullanmalıdır id_rsa_anotheraccount.


Bu bağlantıyı faydalı buldum medium.freecodecamp.org/…
jgreen

~ / .Ssh / config içinde 3 ayrı SSH kimliğim var. Okul sunucusu için bir parola vardır; ayrı çalışma / kişisel GitHub hareketleri için 2 değil. Çalıştırılmaya git pulldevam edildi ve ayrı Kimlik dosyalarına rağmen "IdentitiesOnly = yes" ayrı okullar ve Hostnames, hepsi de mevcut olan okul şifresini sormaya devam etti ssh-add -l... Uni anahtarı, bu kurulumdan bağımsız olarak 'ilk' idi. Kendi bölümünü .ssh / config içinde diğerlerinin altına taşımak zorunda kaldı ve şimdi git pullGitHub accts uni ssh şifresi sorarak w / o başarılı.
mc01

Yanıtlar:


309

Andy Lester'ın yanıtı doğru ama bunun işe yaraması için önemli bir adım daha buldum. Biri kişisel, diğeri iş için olmak üzere iki profil oluşturmaya çalışırken ~/.ssh/config, kabaca şöyleydim:

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

İş profilim, ben olana kadar sürmedi ssh-add ~/.ssh/work_rsa. Bundan sonra github'a doğru profil kullanıldı. Daha önce varsayılan olarak ilk ortak anahtara ayarlanmışlardı.

İçin kimlik doğrulama ajan bağlantı açılamadı kullanarak ssh-add,
kontrol edin: https://stackoverflow.com/a/17695338/1760313


39
Teşekkürler! - ssh-addeksik olduğum şey buydu.
adaçayı

Ssh-add kullanarak, anahtarın dosya izinlerinin doğru ayarlanmadığını görebiliyordum. Bir keresinde her şeyin işe yaradığını düzelttim. Çok teşekkürler!
phatmann

6
Ayrıca bkz . Doblock.com/articles/… . Buradaki yeni önemli bilgi, uzak URL'deki ana makine adına kullanıcı adını (bu örnekte "iş") eklemeniz gerekebileceğidir, yani git@work.github.com: work / my_repo.git (as "git@github.com ..." a karşı)
BobS


15
"Onlar ilk kamu anahtarına varsayılan" o sorunu gidermek için, eklemek IdentitiesOnly yesiçin Host *sizin bölümünde ~/.ssh/configdosyası. Bu, ssh'ye sunucuyu hepsiyle birlikte spam yapmak yerine, belirttiğiniz IdentityFiles uygulamasını kullanmasını söyler.
Mekanik salyangoz

172

Son zamanlarda bunu yapmak zorunda kaldım ve sonunda tüm bu cevapları ve yorumlarını gözden geçirmek zorunda kaldım.


Adım 1: ssh tuşları
İhtiyacınız olan anahtar çiftlerini oluşturun. Bu örnekte bana varsayılan / orijinal 'id_rsa' (varsayılan olan) ve benim yeni 'id_rsa-work' adını verdim:

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


Adım 2: ssh config ~ / .ssh / config
oluşturarak / değiştirerek birden fazla ssh profili oluşturun . Biraz farklı olan 'Ana Bilgisayar' değerlerine dikkat edin:

# 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


Adım 3: ssh-add
Bunu yapmanız gerekebilir veya gerekmeyebilir. Kontrol etmek için çalıştırarak kimlik parmak izlerini listeleyin:

$ 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)

Girişleriniz orada değilse çalıştırın:

ssh-add ~/.ssh/id_rsa_work


Adım 4: Test
Bunların hepsini doğru yaptığınızı test etmek için aşağıdaki hızlı kontrolü öneririm:

$ 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.

Kullanmak istediğiniz anahtar / kimliğe bağlı olarak ana bilgisayar adını (github / work.github) değiştirmeniz gerekeceğini unutmayın. Ama şimdi gitmek için iyi olmalısın! :)


1
Bu harika bir yanıt. Yapılandırma dosyasını kullanmak için her iki ssh tuşlarını eklemek için ssh-add kullanmak zorunda kaldı .. Teşekkürler :)
gaurav.singharoy 23:04

Eklemek istediğim tek şey, ssh-keygen -t rsa komutunu çalıştırdığınızda size varsayılan bir dosya adı verir, bu da özel dosya adınızı girdiğiniz yerdir.
Donato

En iyi cevaplardan biri. Bu video da bana yardımcı oldu. youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
TestingWithArif

İyi yazı, bu yazı git config 'email' ayarını içeriyorsa iyi olur: help.github.com/articles/…
Dave Engineer

43

Diyelim ki alice2 veya daha fazla özel depoya sahip bir github.com kullanıcısı repoN. Bu örnek için sadece iki adlandırılmış depoları ile çalışacağız repo1verepo2

https://github.com/alice/repo1

https://github.com/alice/repo2

Muhtemelen bir sunucuya veya birden fazla sunucuya şifre girmeden bu depolardan çekmeniz gerekir. git pull origin masterÖrneğin gerçekleştirmek istiyorsunuz ve bunun bir şifre sormadan gerçekleşmesini istiyorsunuz.

Ssh-agent ile uğraşmaktan hoşlanmıyorsunuz ~/.ssh/config, ssh istemcinizin Hostname ve kullanıcı adına bağlı olarak hangi özel anahtarı kullanacağını bilmesini sağlayan bir dosya hakkında keşfettiniz (veya şimdi keşfediyorsunuz) , bu:

Host github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/alice_github.id_rsa
  IdentitiesOnly yes

Böylece devam (alice_github.id_rsa, alice_github.id_rsa.pub)ettiniz ve anahtar çiftinizi yarattınız, daha sonra deponuzun .git/configdosyasına da gittiniz ve uzaktan kumandanızın URL'sini şu şekilde değiştirdiniz origin:

[remote "origin"]
        url = "ssh://git@github.com/alice/repo1.git"

Ve sonunda depo Settings > Deploy keysbölümüne gittiniz vealice_github.id_rsa.pub

Bu noktada git pull origin mastersorunsuz bir şifre girmeden yapabilirsiniz .

ama ikinci depo ne olacak?

repo2İçgüdünüz bu anahtarı kapmak ve anahtarları konuşlandırmaya eklemek olacaktır, ancak github.com hata verecek ve anahtarın zaten kullanıldığını söyleyecektir.

Şimdi gidip başka bir anahtar oluşturuyorsunuz ( ssh-keygen -t rsa -C "alice@alice.com"elbette şifreler olmadan) ve bu bir karışıklık haline gelmeyecek, şimdi anahtarlarınızı şu şekilde adlandıracaksınız:

  • repo1 anahtar çifti: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 anahtar çifti: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

Şimdi yeni ortak anahtarı repo2github.com adresindeki Anahtarları dağıtma yapılandırmasına koyacaksınız, ancak şimdi başa çıkmak için bir ssh sorununuz var.

Havuzlar aynı github.cometki alanında barındırılıyorsa, ssh hangi anahtarı kullanacağını nasıl söyleyebilir ?

Kişisel .ssh/configdosya işaret ettiği github.comve 's zaman çekme yapmak kullanılacak olan anahtar bilmiyor.

Bu yüzden github.com ile bir numara buldum. Farklı github.com alt etki alanı içinde her depo ömürleri, bu gibi durumlarda, onlar olacağını Eğer ssh istemcisi söyleyebilir repo1.github.comverepo2.github.com

İlk şey .git/configrepo klonlarınızdaki dosyaları düzenlemektir , bu yüzden bunun yerine şöyle görünürler:

Repo1 için

[remote "origin"]
        url = "ssh://git@repo1.github.com/alice/repo1.git"

Repo2 için

[remote "origin"]
        url = "ssh://git@repo2.github.com/alice/repo2.git"

Ve sonra, .ssh/configdosyanızda, şimdi her bir alt alan için bir yapılandırma girebileceksiniz :)

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

Artık git pull origin masterher iki havuzdan da şifre girmeden edinebilirsiniz .

Birden fazla makineniz varsa, anahtarları makinelerin her birine kopyalayabilir ve yeniden kullanabilirsiniz, ancak makine başına 1 anahtar üretmek ve repo üretmek için bacak işini yapmanızı tavsiye ederim. İşleyecek çok daha fazla anahtarınız olacak, ancak birinden ödün verilirse daha az savunmasız kalacaksınız.


1
Ana bilgisayarla eşleşen alt alan adını belirtmek .ssh/configçok önemli bir adımdır - bunun için çok teşekkürler
Mike Miller

22

Github'da 2 hesabım var ve işte bunu linuxyapmak için yaptığım ( işte).

Anahtarlar

  • ssh-keygenHayatı kolaylaştırmak için 2 çift rsa anahtarı oluşturun .
  • Yerel aracıya üzerinden özel anahtarlar ekleyin ssh-add path_to_private_key
  • Her github hesabı için (ayrı) bir genel anahtar yükleyin.

Yapılandırma

~ / .Ssh / yapılandırma

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

Repo için uzak URL'yi ayarlayın:

  • Ana Bilgisayardaki repo için github-kc:

    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
    
  • Ana Bilgisayardaki repo için github-abc:

    git remote set-url origin git@github-abc:abcdefg/yyy.git
    

Açıklama

Seçenekler ~/.ssh/config:

  • Hostgithub- <identify_specific_user>
    Ana bilgisayar, bir ana bilgisayar ve bir hesabı tanımlayabilen herhangi bir değer olabilir, gerçek bir ana bilgisayar olması gerekmez, örneğin github-kcyerel dizüstü bilgisayarım için github'daki hesabımdan birini tanımlayın,

    Git deposu için uzak url ayarlandığında, bu değer koymak için bir değerdir git@, bu bir repo bir Host ile eşleşir, ör.git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git


  • [Aşağıda alt seçenekler bulunmaktadır Host]
  • Hostname
    gerçek ana bilgisayar adını belirtin, sadece github.comgithub için kullanın ,
  • Usergit
    kullanıcı her zaman gitgithub içindir,
  • IdentityFile
    kullanılacak anahtarı belirtin, yolu ortak bir anahtar koyun,
  • LogLevel
    herhangi bir sorun varsa, hata ayıklamak için günlük düzeyini belirtin DEBUG3, en ayrıntılı bilgileri verir.


güzel - gerek yoktu ssh-add path_to_private_key- muhtemelen bu durumda ajan gerekli değildir çünkü. Yapılandırma dosyası, anahtarların yolunu açıkça tanımlar.
Mark Chackerian

2
@MarkChackerian Sanırım ihtiyacınız yok ssh-addçünkü anahtarlarınız şifre korumalı değil veya (Mac kullanıyorsanız) OSX anahtarlık sizin için kullanıyor. ssh-addanahtarlarınıza her eriştiğinizde parolayı girmenize gerek kalmaz.
Ashhar Hasan

18

Aşağıdaki IdentityFileparametreyi kullanın ~/.ssh/config:

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

Teşekkürler ama bu pek doğru değil. Cevabı buldum ve aşağıda paylaştım.
radesix

Eminim yaklaşımınız sizin durumunuzda işe yarayacaktır. Farklı kullanıcıları ve farklı kimlik dosyalarını tanımlayabilirsiniz. Yapılandırma stanzasında her birine farklı bir Host parametresi vermeniz yeterlidir.
Andy Lester

1
Andy, aşağıda bulduğum bağlantıya göre .com'u ana bilgisayardan bırakmam gerekiyordu. Bunu bir kez yaptım iyi çalıştı.
radesix

5

Ssh config dosyasını düzenlemenin daha basit bir alternatifi (diğer tüm yanıtlarda önerildiği gibi), ayrı bir havuzu farklı (örn. Varsayılan olmayan) ssh anahtarı kullanacak şekilde yapılandırmaktır.

Farklı bir anahtar kullanmak istediğiniz deponun içinde şunu çalıştırın:

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

Ve anahtarınızın çalıştırarak ssh-agent'a eklendiğinden emin olun:

ssh-add ~/.ssh/id_rsa_anotheraccount

Yukarıdaki komutun yalnızca geçerli oturumunuz için ssh-agent'a anahtar ekleyeceğini unutmayın. Bunun sonsuza dek çalışmasını istiyorsanız, ssh-agent'ınıza "kalıcı olarak" eklemeniz gerekir. Örneğin ubuntu ve OSX için bunu nasıl yapacağız .

Bu yaklaşımı global git config ve koşullu kapsamaları kullanarak çoklu havuzlara ölçeklendirmek de mümkün olmalıdır ( örneğe bakın ).


4

Benim durumumda yukarıdaki çözümlerin hiçbiri sorunumu çözmedi, ancak ssh-agent çözdü. Temel olarak, aşağıdakileri yaptım:

  1. Aşağıda gösterilen ssh-keygen kullanarak anahtar çifti oluşturun. Bir anahtar çifti oluşturur (bu örnekte .\keyfileve .\keyfile.pub)

    ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile

  2. keyfile.pubGit sağlayıcısına yükle

  3. Makinenizde ssh-agent'ı başlatın ( ps -ef | grep ssh-agentzaten çalışıp çalışmadığını kontrol edebilirsiniz )
  4. ssh-add .\keyfileKimlik bilgileri eklemek için çalıştır
  5. Şimdi koşabilirsin git clone git@provider:username/project.git

4

Tüm adımları anlamak için çok zaman harcadım. Şimdi adım adım açıklayalım:

  1. Kullanarak yeni kimlik dosyası oluşturun ssh-keygen -t rsa. Buna benzer bir alternatif verin proj1.id_rsave şüphesiz vurun çünkü parolaya ihtiyacınız yok.
  2. Şuraya yeni bölüm ekle .ssh/config:

    Host proj1.github.com
        HostName github.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/proj1.id_rsa
    

İlk bölümü dikkate alın ve proj1.github.comdaha sonra bölüme geri döneceğimizi unutmayın .

  1. Kimlik ssh aracısına ekle ssh-add ~/.ssh/proj1.id_rsa
  2. Ne ilk kez berbat - şimdi bir proj1 repo klonlamak istediğinizde kullanarak proj1.github.com(tam olarak config dosyasından ana bilgisayar). git clone git@proj1.github.com.

İyi bir öğretici.

Ev sahipleriyle uğraşma


Turorial bağlantı için teşekkürler! Bir yazım hatası var: anahtar isimleri id_rsa_proj1ve proj1_id_rsaaslında aynı olmalı. Ayrıca .git/config, öğreticiden ayarlarla ilgili bölümü cevabınıza ekleyebilirsiniz .
cezar

Hala bir yazım hatası var: proj1.id_rsavs.proj1_id_rsa
cezar

2

Kullandım,

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

İyi uyandı.

Farklı kullanıcı adları için farklı rsa anahtarları için .ssh / config dosyanızdaki yukarıdaki ayarı kullanın.


2

@ Stefano'nun cevabının bir tamamlayıcısı olarak, -fbaşka bir hesap için yeni bir SSH anahtarı oluştururken komut kullanmak daha iyidir ,

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

Yana id_rsa_workdosyasında yolunda yok ~/.ssh/, ben elle dosya oluşturmak ve bu çalışma değil :(


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.