Bir istemcide birden fazla SSH özel anahtarı kullanmanın en iyi yolu


870

Farklı sunuculara veya aynı sunucunun farklı bölümlerine bağlanmak için birden fazla özel anahtar kullanmak istiyorum (kullanımlarım sunucunun sistem yönetimi, Git yönetimi ve aynı sunucu içindeki normal Git kullanımı). Ben sadece id_rsaboşuna dosyaları anahtarları istifleme çalıştı .

Görünüşe göre bunu yapmanın basit bir yolu komutu kullanmaktır

ssh -i <key location> login@server.example.com 

Bu oldukça hantal.

Bunu biraz daha kolay hale getirme konusunda herhangi bir öneriniz var mı?


1
Çeşitli konfigürasyonlar ve bunların gücü / eksiklikleri hakkında derinlemesine ilerleyen bu makaleyi yazdım .
Raffi

Yanıtlar:


1234

Gönderen .ssh/config:

Host myshortname realname.example.com
    HostName realname.example.com
    IdentityFile ~/.ssh/realname_rsa # private key for realname
    User remoteusername

Host myother realname2.example.org
    HostName realname2.example.org
    IdentityFile ~/.ssh/realname2_rsa  # different private key for realname2
    User remoteusername

Ve bunun gibi.


24
Teşekkürler Randal! Bazı .ssh / config kazma yaptım ve buldum: github.com/guides/multiple-github-accounts Bana doğru yönde işaret etti.
Justin

6
Bu çok yardımcı oldu ( stackoverflow.com/a/3828682/169153 adresine ek olarak ). Macun anahtarlarını kullanmak istiyorsanız, şu belgeyi izleyin: blog.padraigkitterick.com/2007/09/16/…
Urda

2
Bu gönderiyi çok yararlı buldum. Yapılandırma dosyasını oluştururken yaptığım bir hata, bir yapılandırma dosyası oluşturmak için "dokunma" komutunu çalıştırmak yerine .ssh klasörüne bir .txt dosyası koymak oldu.
M_x_r

53
Aynı şey için birden fazla IdentityFilegiriş belirtebileceğinizi unutmayın Host, bunlar bağlanırken sırayla denenir.
sschuberth

12
IdentitiesOnly yes~ / .Ssh / id_rsa veya diğer kimlikleri önlemek için kullanın . (Bu aslında bir düzenlemeydi)
user3338098

369

Ssh'ye bağlanırken art arda birden fazla tuş denemesi talimatını verebilirsiniz. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

$ cat ~/.ssh/config
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_rsa_old
IdentityFile ~/.ssh/id_ed25519
# ... and so on

$ ssh server.example.com -v
....
debug1: Next authentication method: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa
debug1: read PEM private key done: type RSA
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa_old
debug1: read PEM private key done: type RSA
....
[server ~]$

Bu şekilde hangi anahtarın hangi sunucuyla çalışacağını belirtmeniz gerekmez. Sadece ilk çalışma anahtarını kullanır.

Ayrıca yalnızca belirli bir sunucu anahtarı kabul etmek istiyorsa bir parola girersiniz. Yukarıda görüldüğü gibi ssh bir parola .ssh/id_rsaolsa bile bir şifre istemeye çalışmadı .

Elbette, diğer yanıtlardaki gibi sunucu başına yapılandırmayı geçmiyor, ancak en azından bağlandığınız tüm sunucular için bir yapılandırma eklemeniz gerekmeyecek!


12
Bu, sorulan soru için harika bir çözüm, ancak askerin amaçladığı ihtiyaçları tam olarak karşılamadı. Benim için tam olarak doğru çözümdü ve "Bir istemcide birden fazla SSH özel anahtarını kullanmanın en iyi yolu" ihtiyacını mükemmel bir şekilde karşılıyor.
Wade

2
Bu, config dosyasındaki Host bildirimi altında çalışmıyor gibi görünüyor
Maksim Luzik

29
Bu, git ile iyi çalışmaz, sanki iki github konuşlandırma anahtarınız varsa, listedeki ilk anahtar geçerlidir ve çalışacaktır, ancak github deponun eşleşmediğinden şikayet edecektir.
Adam Reis

Bu daha dinamik bir yaklaşım, bazı durumlarda harika çalışıyor. Bunun için teşekkürler
gbolo

7
Bu sunucularda fail2ban gibi bir şeyiniz olduğunu unutmayın. Diğer anahtarlar tarafından yaratılan başarısız girişimler nedeniyle ... bu hapishanelerden birine girebilirsiniz ...
Piccolo

254

Randal Schwartz dan cevap neredeyse beni tüm yol yardım etti. Sunucuda farklı bir kullanıcı adım var , bu yüzden Kullanıcı anahtar sözcüğünü dosyama eklemek zorunda kaldım :

Host           friendly-name
HostName       long.and.cumbersome.server.name
IdentityFile   ~/.ssh/private_ssh_file
User           username-on-remote-machine

Artık dost adını kullanarak bağlanabilirsiniz:

ssh friendly-name

Daha fazla anahtar kelime OpenSSH kılavuz sayfasında bulunabilir . NOT: Listelenen anahtar kelimelerin bazıları / etc / ssh / ssh_config dosyanızda zaten mevcut olabilir .


Eğer kullanıcı yanılmıyorsam, user @ host ile bağlanırken genellikle doğrudan
URL'de belirtirsiniz

3
'Port' anahtar kelimesini de kullanmayı tercih ederim. Bir başka ilginç anahtar kelime 'StrictHostKeyChecking'.
Ethan

120

Önceki yanıtlar, birden fazla ssh anahtarını yönetmek için bir yapılandırma dosyası oluşturma yolunu düzgün bir şekilde açıkladı. Sanırım açıklanması gereken önemli şey , veri havuzunu klonlarken bir ana bilgisayar adının takma adla değiştirilmesidir .

Senin, Varsayalım şirketin GitHub hesabın kullanıcı adı abc1234 olduğunu . Ve varsayalım kişisel GitHub hesabın kullanıcı adı jack1234 olduğunu

Ve diyelim ki id_rsa_company ve id_rsa_personal olmak üzere iki RSA anahtarı oluşturdunuz . Yani, yapılandırma dosyanız aşağıdaki gibi görünecektir:

# Company account
Host company
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_company

# Personal account
Host personal
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_personal

Şimdi, depoyu şirketin GitHub hesabından klonlarken (demo adlı) , depo URL'si aşağıdaki gibi olacaktır:

Repo URL: git@github.com:abc1234/demo.git

Şimdi, git cloneyukarıdaki depo URL'sini şu şekilde değiştirmeniz gerekir:

git@company:abc1234/demo.git

Yapılandırma dosyasında tanımladığımız gibi github.com'un artık "şirket" takma adı ile nasıl değiştirildiğine dikkat edin.

Benzer şekilde, kişisel dosyadaki havuzun klon URL'sini, yapılandırma dosyasında sağlanan takma ada bağlı olarak değiştirmeniz gerekir.


10
Keşke bu cevabı bir kereden fazla iptal edebilsem ... bu konuya yaklaşmanın doğru yolu ve diğer seçeneklerden daha güvenli ve hızlı. Daha ölçeklenebilir de ( aynı ana bilgisayar adı için farklı anahtarlar tanımlamanızı sağlar )
guyarad

4
Artık zaman kaybetmeyin, bu cevap. Çok teşekkürler.
Luis Milanese

2
Keşke bu cevabı daha önce bulsaydım ... ama hiç olmadığı kadar iyi, Çok teşekkürler!
Hildy

2
Harika bir açıklama! Benim için mükemmel çalışıyor. Ve repo'yu takma adla klonlamayı unuttuysanız, daha sonra uzak menşe url'sini sık sık düzenleyebilirsiniz.
tkahn

1
sadece yapılandırma dosyası olması gerektiğinden dikkat edin (chmod 600)
Christiano Matos

105
foo:~$ssh-add ~/.ssh/xxx_id_rsa

Şunlarla eklemeden önce test ettiğinizden emin olun:

ssh -i ~/.ssh/xxx_id_rsa username@example.com

Hatalarla ilgili herhangi bir sorun yaşarsanız, bazen dosyanın güvenliğini değiştirmek yardımcı olur:

chmod 0600 ~/.ssh/xxx_id_rsa

4
Bu bence en özlü ve zarif çözüm. Bir cazibe gibi çalıştı!
artur

@Bobo bashrc veya bash_profile (veya mac eşdeğeri ne olursa olsun) içine koyabilirsiniz?
T0xicCode 13:13

6
Chmod 0600 için +1 - izin sorunları bağlanmamı engelliyordu
amacy

Benim için bir cazibe gibi çalıştı (ve yaklaşık 0600 perma unutmayın).
Dmytro Uhnichenko

1
Mac ubuntu geldi ve bu tam olarak ne gerekli oldu.
hariom

42
  1. SSH anahtarı oluşturun:

    $ ssh-keygen -t rsa -C <email1@example.com>
    
  2. Üret another SSH key:

    $ ssh-keygen -t rsa -f ~/.ssh/accountB -C <email2@example.com>
    

    Şimdi dizinde iki ortak anahtar ( id_rsa.pub , accountB.pub ) bulunmalıdır ~/.ssh/.

    $ ls -l ~/.ssh     # see the files of '~/.ssh/' directory 
    
  3. ~/.ssh/configAşağıdaki içeriklerle yapılandırma dosyası oluşturun :

    $ nano ~/.ssh/config
    
    Host bitbucket.org  
        User git  
        Hostname bitbucket.org
        PreferredAuthentications publickey  
        IdentityFile ~/.ssh/id_rsa  
    
    Host bitbucket-accountB  
        User git  
        Hostname bitbucket.org  
        PreferredAuthentications publickey  
        IdentitiesOnly yes  
        IdentityFile ~/.ssh/accountB  
    
  4. Hesaptan kopyala default.

    $ git clone git@bitbucket.org:username/project.git
    
  5. Hesaptan kopyala accountB.

    $ git clone git@bitbucket-accountB:username/project.git
    

Daha Fazlasını Gör


24

Ssh-agent kullanımı konusunda Tuomas ile hemfikirim. Ayrıca iş için ikinci bir özel anahtar eklemek istedim ve bu eğitim benim için bir cazibe gibi çalıştı.

Adımlar aşağıdaki gibidir:

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key Örneğin ssh-add ~/.ssh/id_rsa
  3. Doğrulamak $ ssh-add -l
  4. $ssh -v <host url>Örneğin ile test edinssh -v git@assembla.com

4
ssh-agentYıllarca kullandıktan sonra , son zamanlarda gnome-keyringbenim i3wm içinde Gnome's kullanmaya geçti . Nedeni basit: Gnome'un Anahtarlık yöneticisi, hatırlamak zorunda kalmadan ssh anahtarlarını eklemeyi ve kaldırmayı otomatik olarak işler ssh-add. Buna ek olarak, bunların kilidini açmak için bana tek bir şifre (ve güvenlik için belirli bir zamanda zaman aşımı) sağlayın. Herkesinki kendine. Arch'da gnome ayarlarını kullandığımdan, kurulumumla tak ve çalıştır oldu. Anti-gnome iseniz, bu yorumu göz ardı edin.
eduncan911

@ eduncan911, gnome-keyring'in yararlı olabileceğini kabul ediyorum, ama gerçekten ed25519 tuşlarını işlemiyor, bu yüzden benim için bir marş değil. Güncelleme: wiki.archlinux.org/index.php/GNOME/… ' dan şimdi sistemin ssh- agent'ını kullandığını görüyorum , bu artık sorun değil.
Brian Minton

15

İki Bitbucket hesabım olduğunda ve her ikisi için ayrı SSH anahtarları saklamak istediğimde bir süre önce bu sorunla karşılaştım. Bu benim için işe yaradı.

Aşağıdaki gibi iki ayrı ssh yapılandırması oluşturdum.

Host personal.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/personal
Host work.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/work

Şimdi iş hesabımdan bir havuzu klonlamak zorunda kaldığımda - komut aşağıdaki gibiydi.

git clone git@bitbucket.org:teamname/project.git

Bu komutu değiştirmek zorunda kaldım:

git clone git@**work**.bitbucket.org:teamname/project.git

Benzer şekilde, kişisel hesabımdaki klon komutunun

git clone git @ personal .bitbucket.org: ad / personalproject.git

Daha fazla bilgi için bu bağlantıya bakın .



11

Şimdi, git'in son sürümünde, depoya özgü git config dosyasında sshCommand öğesini belirtebiliriz .

  [core]
      repositoryformatversion = 0
      filemode = true
      bare = false
      logallrefupdates = true
      sshCommand = ssh -i ~/.ssh/id_rsa_user   
   [remote "origin"]
      url = git@bitbucket.org:user/repo.git
      fetch = +refs/heads/*:refs/remotes/origin/*

1

ÖNEMLİ: ssh-agent'ı başlatmalısınız

Ssh-add'i aşağıdaki gibi kullanmadan önce ssh-agent'ı (zaten çalışmıyorsa) başlatmalısınız:

eval `ssh-agent -s` # start the agent

ssh-add id_rsa_2 # where id_rsa_2 is your new private key file

Eval komutunun aracıyı pencerelerde GIT bash üzerinde başlattığını unutmayın. Diğer ortamlar, SSH aracısını başlatmak için bir değişken kullanabilir.


1

Sen adında bir yapılandırma dosyası oluşturabilir configsizin de ~/.sshklasöründe. Şunları içerebilir:

Host aws
    HostName *yourip*
    User *youruser*
    IdentityFile *idFile*

Bu, bunun gibi makinelere bağlanmanıza izin verecektir

 ssh aws

1

Ubuntu 18.04'te yapacak bir şey yok.

2. ssh anahtarını başarıyla oluşturduktan sonra, sistem her bağlantı için eşleşen bir ssh anahtarı bulmaya çalışacaktır.

Sadece bu komutlarla yeni bir anahtar oluşturabilirsiniz

# generate key make sure you give it a new name (id_rsa_server2)
ssh-keygen 
# make sure ssh agent is running
eval `ssh-agent`
# add the new key
ssh-add ~/.ssh/id_rsa_server2
# get the public key to add it to a remote system for authentication
cat ~/.ssh/id_rsa_server2.pub

1

GITHUB'da Çoklu Anahtar çiftleri

1.0 SSH YAPILANDIRMA DOSYASI

1.1 CREATE ~ / .ssh / config

1.2 chmod 600 ~ / .ssh / yapılandırma (ZORUNLU)

1.3 dosyaya aşağıdaki girdi:

Ev sahibi pizza

Ana BilgisayarAdı github.com

PreferredAuthentications publickey # isteğe bağlı

IdentityFile ~ / .ssh / privatekey1

Durum A: TAZE YENİ GIT CLONE

git klonu için bu komutu kullanın:

$ git clone git @ pizza: kullanıcı adı / pizzahut_repo.git

Not: Gelecekte .ssh / config ana bilgisayar adını "pizza" olarak değiştirmek istiyorsanız, git klonlanmış klasöre gidin, .git / config dosya URL satırını düzenleyin (bkz. Durum B)

Durum B: ZATEN KLOZ KLASÖRÜ VAR

2.1 klonlanan klasöre gidin, sonra .git klasörüne gidin

2.2 yapılandırma dosyasını düzenle

2.3 URL'yi Eskiden Yeniye güncelleyin:

(Old) url = git@github.com:yourgitusername/pizzahut_repo.git    

(New) url = git@pizza:yourgitusername/pizzahut_repo.git


1

benim için çalışan tek çözüm ~/.ssh/config

Host *
  IdentityFile ~/.ssh/your_ssh_key
  IdentityFile ~/.ssh/your_ssh_key2
  IdentityFile ~/.ssh/your_ssh_key3
  AddKeysToAgent yes

your_ssh_key herhangi bir uzantısı yok, kullanma .pub


0

Centos 6.5'te OpenSSH_5.3p1, OpenSSL 1.0.1e-fips çalıştırarak, anahtar dosyalarımı yeniden adlandırarak sorunu çözdüm, böylece hiçbiri varsayılan ada sahip değildi. .Ssh dizinim id_rsa_foo ve id_rsa_bar içeriyor ancak id_rsa vb. İçermiyor.


Peki tuşlar nasıl kullanılıyor? Herhangi bir otomatik algılama var mı?
robsch

Belirli bir ana makine için doğru anahtarı seçmenin bir yolu için Randal Schwartz'ın cevabına bakın stackoverflow.com/questions/2419566/…
Chris Owens

0

Atlassian blog sayfasında söz konusu gibi .ssh içinde aşağıdaki metni içeren bir yapılandırma oluşturun :

#user1 account
 Host bitbucket.org-user1
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user1
     IdentitiesOnly yes

 #user2 account
 Host bitbucket.org-user2
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user2
     IdentitiesOnly yes

Sonra sonek etki alanı ile ödeme yapabilirsiniz ve projeler içinde Yazar adlarını vb. Yerel olarak yapılandırabilirsiniz.


0

Birden fazla ssh anahtarını korumak için bu sshmulti npm paketini deneyebilirsiniz .


Şiddetle tavsiye ediyorum değil böyle bir şey için UÖM'yi kullanarak. Kısa bir incelemede, bir dizi yalnız kurt geliştiricisini, birkaç yıllık paketleri içeren bir bağımlılık çağrısına sahipti. Sshmulti npm sayfasının kendisi test edilmediğini bildirir.
Jack Wasey

0

İşte ilham kullanılan bu çözüm cevap @ sajib-han arasında. Varsayılan yapılandırma ayarlanmadı, gitlab'deki kişisel hesabım ve diğer belirtilen şirket hesabım. İşte ne yaptım:

Ssh anahtarını oluşturun

ssh-keygen -t rsa -f ~/.ssh/company -C "name.surname@company.com"

Ssh yapılandırmasını düzenleme

nano ~/.ssh/config

    Host company.gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey  
    IdentityFile ~/.ssh/company

Önbelleğe alınmış ssh anahtarlarını sil

ssh-add -D

Dene !

ssh -T git@company.gitlab.com

GitLab'a hoş geldiniz, @ hugo.sohm!

ssh -T git@gitlab.com

GitLab'a hoş geldiniz, @HugoSohm!

Kullanın!

Şirket hesabı

$ git clone git@company.gitlab.com:group/project.git

Kişisel / varsayılan hesap

$ git clone git@gitlab.com:username/project.git

İşte kullandığım kaynak , umarım yardımcı olur!


0

Ben ~ / .ssh / config aşağıdaki ayarlamak için yaklaşımı seviyorum:

# Config for Github to support multiple Github keys
Host  github.com
  HostName github.com
  User git
# UseKeychain adds each keys passphrase to the keychain so you don't have to enter the passphrase each time.
  UseKeychain yes
# AddKeysToAgent would add the key to the agent whenever it is used, which might lead to debugging confusion since then sometimes the one repo works and sometimes the other depending on which key is used first.
#  AddKeysToAgent yes
# I only use my private id file so all private repos don't need the env var `GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa"` to be set.
  IdentityFile ~/.ssh/id_rsa

Daha sonra .envdeponuzda kullanılacak ssh komutunu içeren bir dosya oluşturabilirsiniz:

GIT_SSH_COMMAND="ssh -i ~/.ssh/your_ssh_key"

Daha sonra örneğin dotenv kullanıyorsanız , ortam var otomatik olarak dışa aktarılır ve whoop whoop proje / dizin başına istediğiniz anahtarı belirleyebilirsiniz. Anahtar parolaya, anahtarlığa eklendiğinden yalnızca bir kez sorulur.

Bu çözüm git ile mükemmel çalışır ve bir Mac üzerinde çalışacak şekilde tasarlanmıştır (nedeniyle UseKeychain).

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.