Git'te kabuk komutu yürütülürken kullanılacak özel SSH anahtarı nasıl belirtilir?


1108

Belki de alışılmadık bir durum, ama yerel bilgisayardan bir kabuk (git) komutu yürütürken kullanmak için özel bir SSH anahtarı belirtmek istiyorum.

Temel olarak şöyle:

git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

Ya da daha iyisi (Ruby'de):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone git@github.com:TheUser/TheProject.git")
end

Belirtilen bir özel anahtar kullanan Net :: SSH ile uzak bir sunucuya bağlanma örnekleri gördüm, ancak bu yerel bir komut. Mümkün mü?


6
Bu soruyu SuperUser'da da görün .
Flimm

28
Bunun neden olağandışı olduğunu merak ediyorum, Git'in böyle bir -iseçeneği sshyok.
Nick T

29
Git 2.10 (Q3 2016) ile, aynı zamanda yeni bir yapılandırma vardır: git config core.sshCommand 'ssh -i private_key_file'. Aşağıdaki cevabımı
VonC

3
Bence HeyWatchThis yanıtı, geçerli git cevabının gerektirdiği gibi her git komutu için bir alt kabuk yapmak yerine kurulumdan sonra tüm git komutlarının normal olarak yürütülmesine izin verdiği için kabul edilen cevap olmalıdır.
gloriphobia

Yanıtlar:


800

Bunun gibi bir şey çalışmalıdır (orip tarafından önerilmektedir):

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

alt kabukları tercih ederseniz, aşağıdakileri deneyebilirsiniz (daha kırılgan olsa da):

ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git)

Git, ajanını ortam değişkenine göre bulan SSH'yi çağırır; bu da anahtarın yüklenmesini sağlar.

Alternatif olarak, HOMEyalnızca bir .sshdizin içeren bir dizini kurmaya hazır olmanız koşuluyla , ayar hile yapabilir HOME; bu bir identity.pub veya IdentityFile ayar dosyası içerebilir .


5
Ancak bu, anahtarı kalıcı olarak kabul edilen bir SSH anahtarı olarak ekleyecektir, değil mi? Bundan kaçınmak istiyorum ki user2 kullanıcının projelerini bozamaz. Bir web uygulaması içindir, bu yüzden en iyi seçenek olacak farklı işletim sistemi kullanıcılarını kullanmak pratik değildir.
Christoffer

28
Hayır, git tamamlandığında, ssh-agent sona erer ve anahtar unutulur.
Martin / Löwis

6
bu komut windows git bash üzerinde çalışmaz. Beklenmedik belirteç 'ssh-add' yakınındaki sözdizimi hatası diyor
Mohit

116
Sabit komut satırı (windows veya linux için) şöyle olurdu:ssh-agent bash -c 'ssh-add sshkey; git clone url'
orip

4
ssh-agent $(..)Sözdizimi benim için çalışmıyor ve ben bu işe varsayalım emin nasıl değilim: (ba) sh içine komutları yürütmek gerektiğini $(..)parametre olarak çıkışı ile, ardından koşmak ssh-agent.
Johannes 'balık' Ziemke

1200

Bu çözümlerin hiçbiri benim için işe yaramadı.

Bunun yerine, @Martin v. Löwis'in configSSH için bir dosya ayarlamadan bahsettiğim ayrıntılara değiniyorum .

SSH kullanıcının ~/.ssh/configdosyasını arayacaktır . Ben mayın kurulum var:

Host gitserv
    Hostname remote.server.com
    IdentityFile ~/.ssh/id_rsa.github
    IdentitiesOnly yes # see NOTES below

Ve uzak git deposunu ekliyorum:

git remote add origin git@gitserv:myrepo.git

Ve sonra git komutları benim için normal çalışıyor.

git push -v origin master

NOTLAR

  • IdentitiesOnly yesİçin gereklidir SSH varsayılan davranışı önlemek her protokol için varsayılan dosya adını eşleşen kimlik dosya gönderme. Eğer adlı bir dosya varsa ~/.ssh/id_rsa, BEFORE çalıştı alacak ~/.ssh/id_rsa.githubbu seçenek olmadan.

Referanslar


17
.Ssh / config kullanarak birden fazla anahtar belirttiğinizde, "git remote add" komutunun bir parçası olarak "Host" satırında ana bilgisayar arkadaşınızın adını kullanmanız gerektiğini buldum. Satır "Host stg" ise git remote add <someName> user @ stg: /path_to_git_repo.git "kullanmanız gerekir. User@myserver.com: /path_to_git_repo.git gibi tam sunucu adı kullanıyorsanız, yapılandırma dosyası Bu nedenle, özel anahtar dosyasını doğru bir şekilde seçmiyor.Github ve heroku'ya aynı içeriği iterek bunu denedim ve sadece "git remote add" içinde kolay isim verdiğinizde çalışır
Gopinath MR

2
Github için ana bilgisayar hakkında emin değildi. Bu bağlantıyı buldum: gist.github.com/jexchan/2351996 .
Karsten

1
Birkaç git deposu için birkaç önemli dosyaya sahip olmak istiyorsanız buraya bir göz atın
e271p314

1
Host remote.server.comOrijinal URL'yi kullanabilir ve kullanmaya devam edebilirsiniz
MauganRa

5
İki değişiklikten sonra bu benim için çalıştı. Yapılandırma dosyası yeniyse, yapmayı unutmayın chmod 600 ~/.ssh/config( buraya bakın ). Eğer GitHub kullanıyorsanız eğer, yerini Host gitservile Host github.comomit, Hostname remote.server.comve uzaktan ekleyin git remote add origin git@github.com:user_name/repo_name.git.
miguelmorin

479

Git 2.3.0'dan itibaren basit bir komutumuz var (yapılandırma dosyasına gerek yok):

GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git

3
Ben olsun cannot run ssh -i /home/vagrant/.ssh/git: No such file or directoryeğer mevcutsa olsa 444 Nov 16 18:12 /home/vagrant/.ssh/gitgelenls -l /home/vagrant/.ssh/git
ted

3
@ted: chmod 400 /home/vagrant/.ssh/git
Yash

8
Güzel ve kolay bir çözüm. Bunu çok yapmanız gerekiyorsa takma ad oluşturmanızı öneririm.
Lasse Meyer

5
Unutma chmod 400 <path-to-private-key-file>. Aksi takdirde git komutu özel bir hata mesajı
vermeden

5
(SSH aracısından gelen bir anahtarın aksine) -o IdentitiesOnly=yesile belirtilen anahtarın -ikullanıldığından emin olmak için bu yanıtın da dahil edilmesi iyi olur .
robinst

423

Diğer insanların önerileri ~/.ssh/configekstra karmaşıktır. Bu kadar basit olabilir:

Host github.com
  IdentityFile ~/.ssh/github_rsa

30
Seçeneğe de ihtiyacınız var IdentitiesOnly.
Flimm

4
@EnzeChi Eğer uzaktan kumanda manipüle ederek birden github hesabına sahip olabilir: git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git. Sonra yapılandırmak benziyorHost personal HostName github.com ... Host corporate HostName github.com
emory

@EnzeChi Benzer bir şey yapıyorum, böylece biri getirme diğeri itme için 2 farklı ssh anahtarı kullanıyorum. Getirme işleminin bir parolası yok. İtme yapar.
emory

144

My_git_ssh_wrapper içeriği:

#!/bin/bash

ssh -i /path/to/ssh/secret/key $1 $2

Ardından tuşu kullanarak şunları yapabilirsiniz:

GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git

4
Aynı alanda birden fazla hesabınız varsa, diğer çözümlerin iyi işlemediği çok iyi bir çözüm
Beka

1
Güzel çözüm. Bunu> GIT_SSH = my_git_ssh_wrapper; git clone git@github.com: TheUser / TheProject.git
Shiva

2
Bu çözüm, git'i ana dizini olmadan hesaptan kullanmak istediğiniz durumları da kapsar.
piotrekkr

Fantastik. Bu şekilde özel sunuculara da kullanabilirsiniz:GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
ton

1
Cygwin ortamında benim için çalışan tek yol budur
ChatterOne

113

Git ile 2.10+: (Q3 2016 Eylül yayımlanan 2016 2d), bir ayarlama olanağına sahip yapılandırma için GIT_SSH_COMMAND(açıklandığı gibi ve sadece bir ortam değişkeni Rober Jack, Will 'in cevabı )

Bkz. Taç 3c8ede3 (26 Haz 2016), Nguyễn Thái Ngọc Duy ( pclouds) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde dc21164 tamamlama 2016 Temmuz 19)

Depo başına core.sshCommandhangi değerin GIT_SSH_COMMANDkullanılacağını belirtmek için yeni bir yapılandırma değişkeni eklendi .

core.sshCommand:

Bu değişken ayarlanırsa git fetchve uzak bir sisteme bağlanma zamanları git pushyerine belirtilen komutu kullanırsa ssh.
Komut, GIT_SSH_COMMANDortam değişkeni ile aynı formdadır ve ortam değişkeni ayarlandığında geçersiz kılınır.

Bunun git cloneolabileceği anlamına gelir :

cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file' 
# later on
git clone host:repo.git

Hatta sadece bir komut için ayarlayabilirsiniz:

git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git

Bu ayarı daha kolaydır GIT_SSH_COMMANDolarak Windows üzerinde, hangi çevre değişkeni kaydetti tarafından Mátyás Kuti-Kreszács olacaktı

set "GIT_SSH_COMMAND=ssh -i private_key_file"

@Flimm çıkış tarihleri: calendar.google.com/calendar/…
VonC

Yayınlandı.
Flimm

4
İşler. Millet bunu en iyi cevap olarak görmelidir. Bir kez yayınlandıktan sonra, .git / config dosyasını önceden / tmp dosyasına kopyalanan bir sürümle dağıtmak bilgilendirici olabilir. Yeni bir giriş oluşturuldu: sshCommand = ... Değeri için 'git config core.sshCommand "ssh -i $ HOME / .ssh / privatekeyfile" kullandım.
WeakPointer

1
@Spanky Satır içi komutun git -c core.sshCommand="ssh -i private_key_file" clone host:repo.gitardından yapılandırma kümesi yapabilirsinizgit config core.sshCommand 'ssh -i private_key_file'
dav_i

1
Bu kesinlikle en iyi cevap!
Wagner Patriota

111

Yanıtları ve yorumları özetlemek için , git'i farklı anahtar dosyaları kullanacak şekilde ayarlamanın ve unutmanın en iyi yolu, aynı Windows için çalışan aynı ana bilgisayar (örneğin kişisel bir GitHub hesabı ve bir çalışma) için farklı kullanıcıları da destekler. ayrıca, birden çok kimliği düzenlemek ~/.ssh/config(veya c:\Users\<your user>\.ssh\config) ve belirtmektir:

Host github.com
HostName github.com
IdentityFile /path/to/your/personal/github/private/key
User dandv

Host github-work
HostName github.com
IdentityFile /path/to/your/work/github/private/key
User workuser

Ardından, bir projeyi kişisel kullanıcınız olarak klonlamak için normal git clonekomutu çalıştırmanız yeterlidir.

Repoyu klonlamak workuser çalıştırın git clone git@github-work:company/project.git.


3
Seni aşağıladım çünkü söylediğin her şey zaten yukarıdaki cevaplarda ve gözlerimde daha da açık. Örneğin, Kullanıcıyı neden sırasıyla e-dandv ve workuser olarak tanımlıyorsunuz?
hroptatyr

2
4 yıllık bir soruyu yeni bilgiler olmadan cevapladınız ve cevabınızın "en iyi yol" olduğunu iddia ediyorsunuz. Dahası, diğer kullanıcıların cevaplarını kaldırması için aşağı indirdiniz ve güçlük çektiniz ... sadece yanıtınızı yükseltmek için.
rudimeier

@hroptatyr: Kullandığım dandvve workuserbenim örnek, "örneğin kişisel GitHub hesap ve çalışma tek" desteklemek için. dandvGitHub kullanıcı adım.
Dan Dascalescu

12
Bence sadece ev sahibi takma adlarını açıkladığı için @ thamster'dan daha iyi bir cevap.
David Moles

2
Bu cevabı beğendim. Ancak, benim için bu sadece IdentitiesOnly yesssh config dosyama eklerseniz çalışır .
winni2k

75

Burada belirtildiği gibi: https://superuser.com/a/912281/607049

Repo başına yapılandırabilirsiniz:

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push

1
Ne yapar -F /dev/null? Görebildiğim kadarıyla bu ~/.ssh/configvarsayılandan configFile değişecek ama neden isteniyor? Korumalı alan komutunu sağlamak için?
Dominic

3
linuxcommand.org/man_pages/ssh1.html , hiçbir yapılandırma dosyası belirtmez, bu nedenle git ssh çalıştığında, hiçbir yapılandırma dosyası geçirilmez (aslında bir tür korumalı alan modudur, sadece kullanıcı yapılandırma varsayılan seçeneklerini yoksay) -F
David

1
Aradığım kişi. Teşekkürler!
lostcitizen

Kuber ortamında çalışmak için AAAAA + çözümü. Teşekkürler!
Kobra vs Ninja

1
Merhaba Bunu bir alt modüle nasıl yayacağınızı biliyor musunuz?
Arka Prava Basu

38

Sorun, aynı ana bilgisayarda (örneğin github.com) farklı uzak depolarınız olduğunda ve onlarla farklı ssh anahtarları (yani farklı GitHub hesapları) kullanarak etkileşim kurmak istediğinizde ortaya çıkar .

Bunu yapmak için:

  1. Öncelikle farklı anahtarlarınızı ~/.ssh/configdosyada beyan etmelisiniz .

    # Key for usual repositories on github.com
    Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa
    
    # Key for a particular repository on github.com
    Host XXX
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_other_rsa

    Bunu yaparak ikinci anahtarı github.com için yeni bir "XXX" adıyla ilişkilendirirsiniz.

  2. Daha sonra, tanımladığınız kolay adı kullanması için deponuzun uzak kaynağını değiştirmelisiniz.

    Komut isteminde yerel depo klasörünüze gidin ve geçerli uzak kökeni görüntüleyin:

    >git remote -v
    origin  git@github.com:myuser/myrepo.git (fetch)
    origin  git@github.com:myuser/myrepo.git (push)

    Ardından başlangıç ​​noktasını şununla değiştirin:

    >git remote set-url origin git@XXX:myuser/myrepo.git
    >git remote -v
    origin  git@XXX:myuser/myrepo.git (fetch)
    origin  git@XXX:myuser/myrepo.git (push)

    Artık otomatik olarak sağ tuşla itebilir, getirebilirsiniz.


1
Bu, en iyi uygulama ve desteklenebilir uzun vadeli ssh config dosyanızdaki bağlantıları ve anahtarları düzenlediğiniz kafamdaki en "doğru" cevaptır.
jamescampbell

Diğer çözümler geçici çözümlere benziyor, bu aracın desteklediği harika bir özellik kullanıyor.
Craig.C

Harika, tam olarak ne aradığını, teşekkürler !!
magikMaker

37
GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo

veya

export GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key"
git clone REPO
git push

Bu benim için çalıştı.
mohammed_ayaz

36

Bu ana bilgisayarı veya ip .ssh/configdosyasını şu şekilde dosyaya eklemek için daha iyi bir fikir :

Host (a space separated list of made up aliases you want to use for the host)
    User git
    Hostname (ip or hostname of git server)
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_(the key you want for this repo)

1
Bu yararlıdır, ancak bu ana bilgisayar adıyla tüm etkileşim için repo anahtarını kullanmanızı sağlar. Aynı sunucuda farklı anahtarlar gerektiren başka depolar varsa, bir sarıcı kullanmak ve git'e GIT_SSH ile kullanmasını söylemek daha iyidir.
Joe Block

11
Bu mutlaka doğru değildir. Github için birden fazla anahtar kullanıyorum - biri iş için, diğeri kişisel hesabım için. "Ana Bilgisayar" için bir alan adı girmeniz gerekmez. İstediğiniz her türlü takma adı koyabilirsiniz. Örneğin, ana bilgisayar adlarım olarak gh-home ve gh-work kullanıyorum ve kullandığımda klonladığımda, örneğin, git clone git@gh-work:repo/project.git ~ / .ssh / config dosyamda HostName için github.com'u kullanan iki bölüm var. Sadece farklı IdentityFile ve Host var
blockloop

@ brettof86 bu strateji çoğunlukla işe yarıyor, ancak kontrol ettiğiniz bir depo da github'da barındırılan bir gemiye bağlı olduğunda ne yaparsınız? Gemfile'daki github repo referansı, projedeki diğer geliştiriciler için bir şeyler kırmak istemiyorsanız, "takma adınızı" içermez ...
ktec

@ brettof86 Ayrıca iki farklı github hesabım var (iş, ev), ama benim için çalışmak için örnek alamıyorum. İki kişilik bir örnek gönderebilir misiniz?
Climbs_lika_Spyder

@Climbs_lika_Spyder İşte benim ~/.ssh/config pastebin.com/8rYn7yCi
blockloop

32

GIT_SSH ortam değişkeni ile gittim. İşte benim sarıcı, Joe Block'un yukarıdakine benzer, ancak herhangi bir miktarda argümanı ele alıyor.

Dosya ~ / gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"

Ardından, .bashrc dosyamda aşağıdakileri ekleyin:

export GIT_SSH=~/gitwrap.sh

Bunu .bashrc'de ayarladım. Ama openshift örneğine giriş yaptığımda, onu çağırmıyor gibi görünüyor. Bir şey mi kaçırıyorum?
Jigar Shah

Benim için bir hata ile başarısız .. onun olsa bile script olayı bulamıyor .. ne oluyor emin değilim ... hata: /tmp/gitwrap.sh çalıştıramazsınız: Böyle bir dosya veya dizin yok
ap1234

"Böyle bir dosya veya dizin yok" hatasıyla karşılaşırsanız, gitwrap.shörneğin tam yolunu koyun/home/ubuntu/gitwrap.sh
Tahir Akhtar

-o StrictHostKeyChecking=nossh komutuna eklemek isteyebilirsiniz
dan-man

12

Buradaki diğer çözümlerin hiçbiri sizin için çalışmıyorsa ve birden fazla ssh anahtarı oluşturduysanız, ancak yine de basit şeyler yapamazsanız

git pull

sonra iki ssh anahtar dosyanız olduğunu varsayarsak

id_rsa
id_rsa_other_key

sonra git deposunun içini deneyin:

# Run these commands INSIDE your git directory
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key

ayrıca github varsayılan kullanıcı adınızın ve kullanıcı kimliğinizin aşağıdakilerle doğru olduğundan emin olun:

# Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "mona.lisa@email.com"

Daha fazla bilgi için https://gist.github.com/jexchan/2351996 adresine bakın .


Not alırsanız Could not open a connection to your authentication agent., deneyin $ eval `ssh-agent -s`ve tekrar deneyin.
cgnorthcutt

1
Kaybolanlar için, ssh-addkomut hilesi benim için çalıştı. Ekle, ssh kimlik doğrulaması yapıldığında denenenlerin listesine kimlik anahtarını ekler. Bu benim için iyi çalıştı!
Ben Cartwright

Sizce hangi dizinde çalıştığınız önemli ssh-add?
tripleee

@BenCartwright Çünkü genel ayarları değil, yerel ayarları değiştiriyorsunuz. Bu yaklaşım .git, global olarak git programını değil, depo içinde değişiklik gösterir. Genel --globalkullanıcı adı ve e-posta ayarlamak için kullanabilirsiniz .
cgnorthcutt

11

Normal isteği ile (github bağlanmak gerektiğinde git pull origin masterolarak ana bilgisayar ayarlama) *içinde ~/.ssh/configbenim için çalıştı, başka herhangi bir ana bilgisayar (örneğin, "github" veya "gb") çalışma değildi.

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx

O zaman "Host *" satırının tamamını da bırakabilir.
lionello

1
Uzak URL'nizle eşleşmediği için muhtemelen çalışmıyor. Kullanmak istiyorsanız Host my-host-alias, ayarlamanız gerekir remote.origin.url=git@my-host-alias:[username]/[repo].git.
David Moles

11

Bu çözümlerin çoğu cazip görünüyordu. Ancak, aşağıdaki linkte genel git-wrapping-script yaklaşımını en yararlı buldum:

Ssh Anahtar Dosyası gitkomutuyla belirtme

Mesele gitşu gibi bir komut olmadığıdır :

git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

Alvin'in çözümü, bu boşluğu dolduran iyi tanımlanmış bir bash-wrapper betiği kullanmaktır:

git.sh -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

Nerede git.sh:

#!/bin/bash

# The MIT License (MIT)
# Copyright (c) 2013 Alvin Abad
# https://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command

if [ $# -eq 0 ]; then
    echo "Git wrapper script that can specify an ssh-key file
Usage:
    git.sh -i ssh-key-file git-command
    "
    exit 1
fi

# remove temporary file on exit
trap 'rm -f /tmp/.git_ssh.$$' 0

if [ "$1" = "-i" ]; then
    SSH_KEY=$2; shift; shift
    echo "ssh -i $SSH_KEY \$@" > /tmp/.git_ssh.$$
    chmod +x /tmp/.git_ssh.$$
    export GIT_SSH=/tmp/.git_ssh.$$
fi

# in case the git command is repeated
[ "$1" = "git" ] && shift

# Run the git command
git "$@"

Biliyorum bu bir uzak bitbucket repo için kullanıcı / anahtar tanıma ile başlamıştı bir sorun çözüldü doğrulayabilir git remote update, git pullve git clone; hepsi şimdi cronaksi takdirde sınırlı kabuk gezinme sorun yaşıyordu bir iş komut dosyası iyi çalışıyor . Ayrıca R içinde bu komut dosyasını çağırmak ve hala aynı cronyürütme sorunu (örneğin system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")) çözmek mümkün .

R Ruby ile aynı değil, ama R yapabilirse ... O :-)


1
Harika görünüyor! Bunu test edip cevap vereceğim.
BlueBird

3
Dışında sözdiziminden, bu nasıl daha iyidir GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone thatuser@myserver.com:/git/repo.gituyarınca Robert Jack Will'in cevap ?
David Moles

6

yolunuzda belirli bir tanımlama dosyası ile imzalamak istediğiniz bir dizininiz varsa, ControlPathörneğin .ssh / config dosyası aracılığıyla belirli bir tanımlama dosyasını kullanmayı belirtebilirsiniz :

host github.com
  ControlPath ~/Projects/work/**
  HostName github.com
  IdentityFile ~/.ssh/id_work
  User git

Ardından ssh, belirtilen çalışma yolu altında git komutları yaparken belirtilen kimlik dosyasını kullanır.


Ayrıca özellikleri ayarlayabilirsiniz olduğunu sonradan öğrendim ControlMaster autove ControlPersist yessifrenizi her seferinde yeniden yazmanız gerekmez böylece. Bu makaledeki
buldum

3

Aşağıdaki gibi bir ~ / .ssh / config oluşturmanız gerekir

Host <Your bitbucket server>
User <userid>
Hostname <Your bitbucket server as above>
IdentitiesOnly yes
IdentityFile ~/.ssh/id_rsa<file> This is your private key file

aşağıdaki gibi izin

-rw------- $HOME/.ssh/config

Ortak anahtarınızı git'inize ekleyin (cat ~ / .ssh / id_rsa_pub [veya benzer ad])

ve sonra aşağıdaki gibi klon git

git clone ssh://blahblah@blah.com/userid/test.git

3

Birçok iyi yanıt, ancak bazıları önceden yönetim bilgisi alıyor.

Ben açıkça vurgulamak önemlidir düşünüyorum web URL'sini klonlayarak projenize başlamadan eğer - https://github.com/<user-name>/<project-name>.git
o zaman gerekir emin olun url değer altında [remote "origin"]yer .git/config SSH URL'ye değiştirildi (aşağıdaki kod bloğunu bakınız).

Buna ek olarak, sshCommmandaşağıda belirtildiği gibi eklediğinizden emin olun :

user@workstation:~/workspace/project-name/.git$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    sshCommand = ssh -i ~/location-of/.ssh/private_key -F /dev/null <--Check that this command exist
[remote "origin"]
    url = git@github.com:<user-name>/<project-name>.git  <-- Make sure its the SSH URL and not the WEB URL
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz .


1
Çok teşekkür ederim, git neden ssh tuşunu kullanmadığını anlamaya çalışmak için çok zaman harcadı. Github'un klon düğmesinde varsayılan olarak https URL'sini neden verdiğini anlamıyorum.
Chakradar Raju

2

Git Bash yüklü Windows'da, ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' örneğin bir depo eklemek için aşağıdakileri kullanabilirsiniz : ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git'D sürücüsünde hangi özel anahtar, bilgisayarın klasör testi. Eğer bir depo klonlamak istiyorum Ayrıca, değiştirebilir git remote add originile git clone.

Bunu Git Bash'e girdikten sonra sizden parola isteyecektir!

Özel anahtar ve macun özel anahtarını açan farkında olun, farklıdır!

Anahtarlarınızı puttygen ile oluşturduysanız, özel anahtarınızı openssh'e dönüştürmelisiniz!


1

GIT_SSH ortam değişkenini kullanabilirsiniz. Ancak ssh ve seçenekleri bir kabuk betiğine sarmanız gerekir.

man gitKomut kabuğunuzda git kılavuzuna bakın .


1

Ben kullanıyorum zshve farklı anahtarlar ssh-agentdizüstü bilgisayarımdaki başka amaçlar için (yani uzak sunuculara erişim) otomatik olarak zsh kabuğuma yüklenir . @ Nick'in cevabını değiştirdim ve sık sık yenilenmesi gereken depolarımdan biri için kullanıyorum. (Bu durumda dotfilesçalıştığım her yerde tüm makinelerimde aynı ve en son sürümü istiyorum.)

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
  • Bir ssh-ajanı ortaya çıkar
  • Temsilciye salt okunur anahtar ekle
  • Dizini git repoma değiştir
  • Eğer cduzaktan repo repoya dir başarılı, çekme
  • Yumurtlayan ssh ajanını öldür. (Pek çok ajanın etrafta dolaşmasını istemezdim.)

1

için gitlab RSAAuthentication yes

Host gitlab.com
  RSAAuthentication yes
  IdentityFile ~/.ssh/your_private_key_name
  IdentitiesOnly yes

doktor burada


artık sağladığınız bağlantıda belirtilmemiş gibi görünüyor
rbennell


0

SSH port numarası (varsayılan) 22 değilse, ekleyin Port xxiçinde~/.ssh/config

Benim durumumda (sinoloji),

Host my_synology
    Hostname xxxx.synology.me
    IdentityFile ~/.ssh/id_rsa_xxxx
    User myname
    Port xx

Ardından, config içindeki Host başlığını kullanarak klonlayın. ("my_synology". @chopstik 'in "*" ını önlemek için)

git clone my_synology:path/to/repo.git

0

Benim gibiyseniz şunları yapabilirsiniz:

  • Ssh anahtarlarınızı düzenli tutun

  • Git klon komutlarınızı basit tutun

  • İstediğiniz sayıda havuz için istediğiniz sayıda anahtarı kullanın.

  • Ssh anahtar bakımınızı azaltın.

Anahtarlarımı dizinimde ~/.ssh/keyssaklıyorum.

Konfigürasyon yerine konvansiyonu tercih ederim.

Kodun hukuk olduğunu düşünüyorum; ne kadar basitse o kadar iyidir.

ADIM 1 - Takma Ad Oluştur

Bu takma adı kabuğunuza ekleyin: alias git-clone='GIT_SSH=ssh_wrapper git clone'

ADIM 2 - Komut Dosyası Oluştur

Bu ssh_wrapper komut dosyasını PATH'ınıza ekleyin:

#!/bin/bash
# Filename: ssh_wrapper

if [ -z ${SSH_KEY} ]; then
    SSH_KEY='github.com/l3x'  # <= Default key
fi
SSH_KEY="~/.ssh/keys/${SSH_KEY}/id_rsa"
ssh -i "${SSH_KEY}" "$@"

ÖRNEKLER

Github.com/l3x anahtarını kullanın:

KEY=github.com/l3x git-clone https://github.com/l3x/learn-fp-go

Aşağıdaki örnekte ayrıca github.com/l3x anahtarı kullanılır (varsayılan olarak):

git-clone https://github.com/l3x/learn-fp-go

Bitbucket.org/lsheehan anahtarını kullanın:

KEY=bitbucket.org/lsheehan git-clone git@bitbucket.org:dave_andersen/exchange.git

NOTLAR

Ssh_wrapper betiğindeki varsayılan SSH_KEY öğesini çoğu zaman kullandığınız şekilde değiştirin. Bu şekilde, çoğu zaman KEY değişkenini kullanmanız gerekmez.

"Hey! Bu bir takma ad, bir senaryo ve bazı anahtar dizini ile çok şey oluyor" diye düşünebilirsiniz, ama benim için kongre. Neredeyse tüm iş istasyonlarım (ve bu konudaki sunucuları) benzer şekilde yapılandırıldı.

Buradaki amacım düzenli olarak yürüttüğüm komutları basitleştirmek.

Bash komut dosyaları, takma adlar vb. Gibi sözleşmelerim tutarlı bir ortam yaratıyor ve işleri basit tutmama yardımcı oluyor.

KISS ve isimler önemlidir.

Tasarımla ilgili daha fazla ipucu için Bölüm 4'teki SOLID Design'ı kitabımdan inceleyin: https://www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW

Umarım yardımcı olur. - Lex



0

Bu yöntemle ilgili sorun, en azından Windows'ta bash.exe tarafından çalıştırıldığında, her zaman uykuda kalacak yeni bir işlem oluşturacağıdır.

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

Senkronize repo için bunu programda kullanmak istiyorsanız, sonuna "&& ssh-agent -k" eklemeniz gerekir.

Gibi bir şey:

ssh-agent bash -c 'ssh-add C:/Users/user/.ssh/your_key; git -C "C:\Path\to\your\repo" pull && ssh-agent -k' 

ssh-agent -k işlemi tamamlandığında işlemi öldürür.


0

Sadece anahtarı eklemem ve git klonunu tekrar çalıştırmam gerekiyordu.

ssh-add ~/.ssh/id_rsa_mynewkey
git clone git@bitbucket.org:mycompany/myrepo.git

-1

İşte bu soruna çözüm ararken bulduğum ssh anahtar kesmek:

Örneğin 2 farklı anahtar kümeniz var:

key1, key1.pub, key2, key2.pub

Bu anahtarları .sshdizininizde saklayın

Şimdi .bashrcya da .bash_profiletakma ad dosyanıza bu komutları ekleyin

alias key1='cp ~/.ssh/key1 id_rsa && cp ~/.ssh/key1.pub id_rsa.pub'

alias key2='cp ~/.ssh/key2 id_rsa && cp ~/.ssh/key2.pub id_rsa.pub'

İşte bu kadar! İstediğiniz zaman tuşları değiştirmek için bir kısayolunuz var!

Umarım bu sizin için çalışır.

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.