Belirli bir alan adı için git push için bir SSH anahtarı belirtme


342

Aşağıdaki kullanım durumum var: Ben 'kendi' özel anahtarını kullanmak için itmek istiyorum iken git@git.company.com:gitolite-admin, kullanıcının özel anahtarını kullanarak gitolite-adminitmek istiyorum git@git.company.com:some_repo. AFAIK, bunu kullanarak çözemiyorum ~/.ssh/config, çünkü kullanıcı adı ve sunucu adı her iki durumda da aynıdır. Çoğunlukla kendi özel anahtarımı kullandığım ~/.ssh/configiçin , için tanımlanmış olan anahtarım var git@git.company.com. Herkes tek bir gitçağrı için kullanılan anahtarı geçersiz kılmanın bir yolunu biliyor mu ?

(Kenara: gitolite, anahtara kimin bastığını kimin ayırt ettiğini ayırt eder, bu nedenle erişim, sahiplik ve denetim açısından user @ server dizesinin farklı kullanıcılar için aynı olması bir sorun değildir.)


Yanıtlar:


597

Kullanıcı ve ana bilgisayar aynı olsa bile, yine de ayırt edilebilirler ~/.ssh/config. Örneğin, yapılandırmanız aşağıdaki gibi görünüyorsa:

Host gitolite-as-alice
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_rsa.alice
  IdentitiesOnly yes

Host gitolite-as-bob
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_dsa.bob
  IdentitiesOnly yes

Sonra sadece kullanmak gitolite-as-aliceve gitolite-as-bobyerine URL'nizdeki hostname:

git remote add alice git@gitolite-as-alice:whatever.git
git remote add bob git@gitolite-as-bob:whatever.git

Not

IdentitiesOnly yesVarsayılan kimliklerin kullanılmasını önleme seçeneğini eklemek istersiniz . Aksi takdirde, varsayılan adlarla eşleşen kimlik dosyalarınız varsa, ilk olarak denenir, çünkü diğer yapılandırma seçeneklerinden farklı olarak ("ilk olarak kazanır") IdentityFileseçenek denenecekler listesine eklenir . Bkz. Https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807


9
Harika, teşekkürler. ~ / .Ssh / config
Confusion

4
Bu cevap için de teşekkürler! Benim için bir şey, IdentityFile'ın tam bir yol olması gerektiğiydi (sadece ID_rsa.rick'i IdentityFile'a argümanım olarak koydum ve bu başarısız oldu). IdentityFile ile ilgili diğer sözdizimi için ssh_config (5) kılavuz sayfasına bakın.
rickumali

1
Açık ve çok yararlı cevap için çok teşekkür ederim. Bir süre bu çalışma almaya çalışmış ve daha önce aynı kullanıcının aynı id_rsa özel anahtar dosyasını kullanmak zorunda olduğu varsayımıyla vazgeçti.
DrCord

7
git@O verilmektedir olarak uzak part gerekli değildir Userconfig hattı.
dolmen

2
Ev sahibi için olan IdentitiesOnly yeshattın hemen ardından başka bir satır ekleyene kadar bu çözümle mücadele ediyordum IdentityFile. Görünüşe göre birden fazla kimlikten geçiyordu ve bunlardan birinin ev sahibine erişimi engellendi.
Tesisatçı Adam

57

Yukarıda Mark Longair tarafından önerilene alternatif bir yaklaşım , alternatif bir SSH anahtarıyla herhangi bir uzaktan kumanda üzerinde herhangi bir git komutunu çalıştıracak bir takma ad kullanmaktır . Fikir temel olarak git komutlarını çalıştırırken SSH kimliğinizi değiştirmek.

Diğer cevaptaki ana bilgisayar takma adı yaklaşımına göre avantajları:

  • İle çalışacak herhangi belirttiğiniz edemez bile, git komutları veya takma ad remoteaçıkça.
  • Birçok depo ile çalışmak daha kolaydır, çünkü her istemci makine için depo başına bir kez değil, istemci makine başına yalnızca bir kez ayarlamanız gerekir.

Birkaç küçük komut dosyası ve bir git takma adı kullanıyorum admin. Bu şekilde yapabilirim, örneğin:

git admin push 

Alternatif ("admin") SSH tuşunu kullanarak varsayılan uzaktan kumandaya itmek için. Yine, pushbu takma adla (sadece değil ) herhangi bir komutu kullanabilirsiniz . Hatta yapabileceği git admin clone ...yalnızca "admin" tuşunu kullanarak erişebilir olacağını bir depo klonlamak.

Adım 1: Alternatif SSH anahtarlarını oluşturun, başka birinin makinesinde yapıyorsanız isteğe bağlı olarak bir parola ayarlayın.

Adım 2: SSH kullanan, ancak varsayılan yerine belirli bir SSH anahtarı kullanan “ssh-as.sh” adlı bir komut dosyası oluşturun:

#!/bin/bash
exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "$@"

Adım 3: Verilen SSH anahtarını kullanarak git komutlarını çalıştıran “git-as.sh” adlı bir komut dosyası oluşturun.

#!/bin/bash
SSH_KEYFILE=$1 GIT_SSH=${BASH_SOURCE%/*}/ssh-as.sh exec git "${@:2}"

4. Adım: Takma ad ekleyin (aşağıdaki “PATH_TO_SCRIPTS_DIR” için uygun bir şey kullanarak):

# Run git commands as the SSH identity provided by the keyfile ~/.ssh/admin
git config --global alias.admin \!"PATH_TO_SCRIPTS_DIR/git-as.sh ~/.ssh/admin"

Daha fazla bilgi için: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/


4
Çok güzel bir cevap. Etrafınıza çift tırnak eklemeyi unutmayın $@-> "$@"güvende olmak için.
kevinarpe

@sinelaw Bu hala çalışıyor mu? Her zaman İzin reddedildi hatası alıyorum
Alok Kumar

56

Git ortam değişkenini kullanabilirsiniz GIT_SSH_COMMAND. Bunu git deponuzun altındaki terminalinizde çalıştırın:

GIT_SSH_COMMAND='ssh -i ~/.ssh/your_private_key' git submodule update --init

~/.ssh/your_private_keyKullanmak istediğiniz ssh özel anahtarının yoluyla değiştirin . Ve (örnekte olduğu müteakip git komutunu değiştirebilirsiniz git submodule update --init) diğerleri sevmeye git pull, git fetchvb


1
Tam doküman git-scm.com/docs/git#git-codeGITSSHcode ; Bir ihtiyacı recentish olsa Git (> = 2.3. *).
Christian Ulbrich

2
Bir ortam değişkeni ayarlamak dışında hiçbir şey gerektirmeyen basit bir çözüm için teşekkür ederiz.
Noah Sussman

4
~ / .Ssh / id_rsa'nızın (veya varsayılan anahtarınız ne olursa olsun) -i aracılığıyla ilettiğiniz anahtardan öncelikli olacağını unutmayın. Yani gerçekten diğer anahtarları yoksaymak için GIT_SSH_COMMAND = 'ssh -i ~ / .ssh / your_private_key -o IdentitiesOnly = yes' kullanmak
istersiniz

git push'u nasıl güncelleyebilirsiniz? Belgelerde bulamadım
lebed2045

Sinelaw'ın cevabına benzer şekilde bash veya git takma adları oluşturmak güzel olurdu, ancak bir yerde komut dosyaları oluşturmak yerine bu yöntemi kullanmak.
Inigo

14

Bir Unix tabanlı sistemler (Linux, BSD, Mac OS X), varsayılan kimlik dizin saklanır $ HOME / .ssh 2 dosyalarında,: private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub kullandığınızda sshseçeneği olmadan -i, uzaktan sistem ile kimlik doğrulaması için varsayılan özel anahtarı kullanır.

Kullanmak istediğiniz başka bir özel anahtarınız varsa, örneğin $ HOME / .ssh / deploy_key ,ssh -i ~/.ssh/deploy_key ...

Sinir bozucu. $ HOME / .bash_profile klasörünüze aşağıdaki satırları ekleyebilirsiniz : ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa

Yani her kullanışınızda sshya gitda scp( ya da temelde ssh), -iartık seçeneği kullanmak zorunda değilsiniz .

$ HOME / .bash_profile dosyasına istediğiniz kadar anahtar ekleyebilirsiniz .


10

Başka bir alternatif, ssh kimliklerinizi yönetmek için ssh-ident kullanmaktır .

Geçerli çalışma dizininize, ssh seçeneklerine vb. Dayalı olarak farklı anahtarları otomatik olarak yükler ve kullanır ... bu, ssh ile farklı anahtarlar ve kimlikler kullanarak şeffaf bir şekilde sonuçlanan bir iş / dizin ve özel / dizine kolayca sahip olabileceğiniz anlamına gelir.


9

Win7'de Git Bash kullanıyorum. Aşağıdakiler benim için çalıştı.

~ / .Ssh / config veya c: / users / [kullanıcı_adınız] /. Ssh / config dizininde bir yapılandırma dosyası oluşturun. Dosyaya şunu girin:

Host your_host.com
     IdentityFile [absolute_path_to_your_.ssh]\id_rsa

Ben ev sahibi bir URL olmalı ve sadece bir "isim" veya ev sahibi için ref olması gerekir. Örneğin,

Host github.com
     IdentityFile c:/users/[user_name]/.ssh/id_rsa

Yol ayrıca / c / users / [kullanıcı_adı] / .... biçiminde de yazılabilir

Giordano Scalzo tarafından sağlanan çözüm de harika. https://stackoverflow.com/a/9149518/1738546


9

Git 2.10 ve yukarısı gitconfig sshCommand ayarını kullanmak da mümkündür. Dokümanlar durumu :

Bu değişken ayarlanırsa, git fetch ve git push, uzak bir sisteme bağlanması gerektiğinde ssh yerine belirtilen komutu kullanır. Komut, GIT_SSH_COMMAND ortam değişkeniyle aynı formdadır ve ortam değişkeni ayarlandığında geçersiz kılınır.

Bir kullanım örneği şöyle olabilir: git config core.sshCommand "ssh -i ~/.ssh/[insert_your_keyname]

Bazı durumlarda, ssh_config komutu geçersiz kıldığı için bu çalışmaz, bu durumda ssh -i ~/.ssh/[insert_your_keyname] -F /dev/nullssh_config'i kullanmaya çalışmayın.


8

Birlikte topladım ve birkaç tekniği birleştiren diğer cevapları okumaya dayalı olarak github ile aşağıdaki yaklaşımı test ettim:

  • SSH yapılandırmasını düzelt
  • git URL yeniden yazma

Bu yaklaşımın avantajı, bir kez kurulduktan sonra, bunu düzeltmek için herhangi bir ek iş gerektirmez - örneğin, uzak URL'leri değiştirmenize veya bir şeyleri farklı bir şekilde klonlamayı hatırlamanız gerekmez - URL yeniden yazma işlemi her şeyin işe yaramasını sağlar .

~/.ssh/config

# Personal GitHub
Host github.com
  HostName github.com
  User git
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/github_id_rsa

# Work GitHub
Host github-work
  HostName github.com
  User git
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/work_github_id_rsa

Host *
  IdentitiesOnly yes

~/.gitconfig

[user]
    name = My Name
    email = personal@personal.email

[includeIf "gitdir:~/dev/work/"]
    path = ~/dev/work/.gitconfig

[url "github-work:work-github-org/"]
    insteadOf = git@github.com:work-github-org/

~/dev/work/.gitconfig

[user]
    email = work@work.email

Tüm çalışma depolarınızı ~ / dev / work ve kişisel öğelerin altında başka bir yerde tuttuğunuz sürece git, sunucuya çekme / klonlama / itme işlemleri yaparken doğru SSH anahtarını kullanacak ve ayrıca tüm e-posta adreslerini de ekleyecektir. taahhüt eder.

Referanslar:


Bu klonlama ile nasıl çalışır? includeIfsadece .gitdüşündüğüm bir dizin varsa çalışması gerekir ?
detly

Bekle, ben hallederim URL yeniden yazma. Bu cevap inanılmaz derecede faydalı!
detly

4

Git'in Windows'ta ssh sürümünü kullanıyorsanız, ssh config içindeki kimlik dosyası satırı aşağıdaki gibi görünür

IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice

nerede /ciçindirc:

Kontrol etmek için git'in bash'ında

cd ~/.ssh
pwd 

3

Varsayılan Ana Bilgisayar yapılandırmasını kaldırmanız (veya yorum yapmanız) gerekebilir .ssh / yapılandırma


1

ssh dosya yapılandırma anahtarında en çok belirttiğiniz:

# Default GitHub user
Host one
 HostName gitlab.com
 User git
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/key-one
 IdentitiesOnly yes

#two user
Host two
 HostName gitlab.com
 User git
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/key-two
 IdentitiesOnly yes

0

Başka birisinin belirttiği gibi, core.sshCommandyapılandırma SSH anahtarını ve diğer parametreleri geçersiz kılmak için kullanılabilir.

Aşağıda, alternatif bir anahtarınızın bulunduğu ~/.ssh/workrsave altında klonlanan tüm depolar için kullanmak istediğiniz bir örnek~/work .

  1. Aşağıdakiler .gitconfigaltında yeni bir dosya oluşturun ~/work:
[core]
  sshCommand = "ssh -i ~/.ssh/workrsa"
  1. Global git config'inize ~/.gitconfigşunları ekleyin:
[includeIf "gitdir:~/work/"]
  path = ~/work/.gitconfig

0

Kullanmanın bir yolu ~/.ssh/config, Matchkısıtlama yerine kısıtlamayı kullanmaktır Host. Özellikle Match Exec, bildirimlerin uygulanıp uygulanmayacağına karar vermek için bir kabuk komutu çağırır. Bash içinde aşağıdaki komutu kullanabilirsiniz:

[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]

Bu, [iki dizenin eşit olup olmadığını doğrulamak için bash komutunu kullanır . Bu durumda, dizenin komuttan git@git.company.com:gitolite-adminelde edilen çıktıyla eşleşip eşleşmediğini test eder $(git config --get remote.origin.url)''.

Kabuğun üzerinde bulunduğu havuzu tanımlayan başka herhangi bir komutu kullanabilirsiniz. Bu işlemin gerçekleşmesi için öyle önemli olması $SHELLdeğişkeni benim durumumda, sizin kabuğuna tanımlanmış /bin/bash. Tam örnek şu şekilde olur ~/.ssh/config:

Match Exec "[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]"
  IdentityFile ~/.ssh/gitolite-admin
  IdentitiesOnly yes
  ForwardAgent no
  ForwardX11 no
  ForwardX11Trusted no

Match Exec "[ git@git.company.com:some_repo = $(git config --get remote.origin.url)'' ]"
  IdentityFile ~/.ssh/yourOwnPrivateKey
  IdentitiesOnly yes
  ForwardAgent no
  ForwardX11 no
  ForwardX11Trusted no

Bu örnekte ~/.ssh/yourOwnPrivateKey, kendi özel anahtarınızı ve ~/.ssh/gitolite-adminkullanıcının özel anahtarını içerdiğini varsaydım gitolite-admin. IdentitiesOnly yesGit sunucusuna Mark Longair tarafından belirtilen tek bir anahtarın sunulduğundan emin olmak için bildirimi ekledim . Diğer bildirimler git için sadece standart ssh seçenekleridir.

some_repoFarklı anahtarlarla kullanmak istediğiniz birkaç tane varsa bu yapılandırmayı ekleyebilirsiniz . Birkaç havuzunuz varsa git@git.company.comve çoğunda ~/.ssh/yourOwnPrivateKeybu anahtarı ana bilgisayar için varsayılan olarak eklemek daha mantıklıdır. Bu durumda ~/.ssh/configşöyle olur:

Match Exec "[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]"
  IdentityFile ~/.ssh/gitolite-admin
  IdentitiesOnly yes

Host git.company.com
  IdentityFile ~/.ssh/yourOwnPrivateKey
  IdentitiesOnly yes
  ForwardAgent no
  ForwardX11 no
  ForwardX11Trusted no

Siparişin ve Host git.company.comkısıtlamanın Match Execbir veya birinden sonra görünmesi gerektiğini unutmayın .


0

Kullanarak deponuzu yapılandırın git config. Örneğin:

git config --add --local core.sshCommand 'ssh -i ~/.ssh/<<<PATH_TO_SSH_KEY>>>'
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.