Bagaimana cara menentukan kunci SSH pribadi yang akan digunakan saat menjalankan perintah shell pada Git?

1110

Mungkin situasi yang agak tidak biasa, tetapi saya ingin menentukan kunci SSH pribadi untuk digunakan ketika menjalankan perintah shell (git) dari komputer lokal.

Pada dasarnya seperti ini:

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

Atau bahkan lebih baik (dalam Ruby):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone [email protected]:TheUser/TheProject.git")
end

Saya telah melihat contoh menghubungkan ke server jauh dengan Net :: SSH yang menggunakan kunci pribadi yang ditentukan, tetapi ini adalah perintah lokal. Apa itu mungkin?

Christoffer
sumber
6
Lihat pertanyaan ini di SuperUser juga.
Flimm
28
Saya bertanya-tanya mengapa ini sangat tidak biasa sehingga Git tidak memiliki -ipilihan seperti sshitu.
Nick T
29
Dengan git 2.10 (Q3 2016), Anda juga memiliki konfigurasi baru: git config core.sshCommand 'ssh -i private_key_file'. Lihat jawaban saya di bawah ini
VonC
3
Menurut pendapat saya, jawaban HeyWatchThis harus menjadi jawaban yang diterima karena memungkinkan semua perintah git dieksekusi seperti biasa setelah pengaturan daripada harus membuat subkulit untuk setiap perintah git seperti yang diterima saat ini membutuhkan jawaban.
gloriphobia

Jawaban:

801

Sesuatu seperti ini seharusnya berfungsi (disarankan oleh orip):

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git'

jika Anda lebih suka subkulit, Anda dapat mencoba yang berikut (meskipun lebih rapuh):

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

Git akan memanggil SSH yang akan menemukan agennya dengan variabel lingkungan; ini akan, pada gilirannya, memiliki kunci dimuat.

Atau, pengaturan HOMEjuga dapat melakukan trik, asalkan Anda bersedia menata direktori yang hanya berisi .sshdirektori sebagai HOME; ini dapat berisi identity.pub, atau pengaturan file konfigurasi IdentityFile.

Martin v. Löwis
sumber
5
Tapi ini akan menambahkan kunci secara permanen sebagai kunci SSH yang diterima, kan? Saya ingin menghindarinya sehingga pengguna2 tidak dapat mengacaukan proyek-proyek pengguna. Ini untuk aplikasi web sehingga tidak praktis untuk menggunakan pengguna OS yang berbeda, yang akan menjadi pilihan terbaik.
Christoffer
28
Tidak, ketika git selesai, ssh-agent berakhir, dan kuncinya dilupakan.
Martin v. Löwis
6
perintah ini tidak bekerja pada windows git bash. Dikatakan kesalahan sintaks dekat token tak terduga 'ssh-add'
Mohit
116
Baris perintah tetap (untuk windows atau linux) akan menjadi sesuatu seperti:ssh-agent bash -c 'ssh-add sshkey; git clone url'
orip
4
The ssh-agent $(..)sintaks tidak bekerja untuk saya dan saya tidak yakin bagaimana ini adalah rasa untuk pekerjaan: (ba) sh harus menjalankan perintah dalam $(..)pertama, kemudian jalankan ssh-agent dengan output sebagai parameter.
Johannes 'fish' Ziemke
1200

Tidak ada solusi yang berhasil untuk saya.

Sebagai gantinya, saya menguraikan tentang @Martin v. Löwis tentang pengaturan a config file untuk SSH.

SSH akan mencari ~/.ssh/configfile pengguna . Saya memiliki pengaturan milik saya sebagai:

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

Dan saya menambahkan repositori git jarak jauh:

git remote add origin git@gitserv:myrepo.git

Dan kemudian perintah git bekerja secara normal untuk saya.

git push -v origin master

CATATAN

  • The IdentitiesOnly yesdiperlukan untuk mencegah perilaku default SSH mengirim file identitas yang cocok dengan nama file default untuk setiap protokol. Jika Anda memiliki file dengan nama ~/.ssh/id_rsayang akan dicoba SEBELUM Anda ~/.ssh/id_rsa.githubtanpa opsi ini.

Referensi

HeyWatchThis
sumber
17
Saya menemukan bahwa ketika Anda menentukan beberapa kunci menggunakan .ssh / config, Anda harus menggunakan nama teman host di baris "Host" sebagai bagian dari perintah "git remote add". Jika barisnya adalah "Host stg", maka Anda perlu menggunakan git remote add <someName> user @ stg: /path_to_git_repo.git ". Jika Anda menggunakan nama server yang tepat seperti [email protected]: /path_to_git_repo.git, file konfigurasi tidak dipilih oleh git. Oleh karena itu, ini tidak memilih file kunci pribadi dengan benar. Saya mencoba ini dengan mendorong konten yang sama ke github dan heroku dan hanya bekerja ketika Anda memberikan nama yang ramah di "git remote add"
Gopinath MR
2
Saya tidak yakin tentang Host untuk github. Saya menemukan tautan ini: gist.github.com/jexchan/2351996 .
Karsten
1
Lihatlah di sini jika Anda ingin memiliki beberapa file kunci untuk beberapa repositori git
e271p314
1
Anda bisa menggunakan Host remote.server.comdan tetap menggunakan URL asli
MauganRa
5
Ini bekerja untuk saya setelah dua perubahan. Jika file konfigurasi baru, jangan lupa lakukan chmod 600 ~/.ssh/config(lihat di sini ). Dan jika Anda menggunakan GitHub, ganti Host gitservdengan Host github.com, hapus Hostname remote.server.com, dan tambahkan jarak jauh dengan git remote add origin [email protected]:user_name/repo_name.git.
miguelmorinin
480

Mulai dari Git 2.3.0 kami juga memiliki perintah sederhana (tidak memerlukan file config):

GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git
Robert Jack Will
sumber
3
Saya mendapatkan cannot run ssh -i /home/vagrant/.ssh/git: No such file or directorymeskipun ada 444 Nov 16 18:12 /home/vagrant/.ssh/gitdarils -l /home/vagrant/.ssh/git
ted
3
@ted: chmod 400 /home/vagrant/.ssh/git
Yash
8
Solusi yang bagus dan mudah. Saya sarankan membuat alias jika Anda harus sering melakukan ini.
Lasse Meyer
5
Jangan lupa chmod 400 <path-to-private-key-file>. Kalau tidak, perintah git mungkin gagal tanpa pesan kesalahan khusus ...
Eonil
5
Akan lebih baik jika jawaban ini juga termasuk -o IdentitiesOnly=yesuntuk memastikan bahwa kunci yang ditentukan dengan -idigunakan (sebagai lawan kunci dari agen SSH).
robinst
423

Saran orang lain tentang itu ~/.ssh/configsangat rumit. Ini bisa sesederhana:

Host github.com
  IdentityFile ~/.ssh/github_rsa
philfreo
sumber
30
Anda membutuhkan IdentitiesOnlyopsi juga.
Flimm
4
@EnzeChi Anda dapat memiliki beberapa account github dengan memanipulasi remote: git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git. Kemudian Anda Host personal HostName github.com ... Host corporate HostName github.com
mengkonfigurasi
@ EnnzeChi Saya melakukan sesuatu yang serupa sehingga saya menggunakan 2 kunci ssh yang berbeda - satu untuk mengambil dan yang lainnya untuk mendorong. Pengambilan tidak memiliki frasa sandi. Dorongan itu.
emory
144

Isi my_git_ssh_wrapper:

#!/bin/bash

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

Kemudian Anda dapat menggunakan kunci dengan melakukan:

GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git
Joe Block
sumber
4
Solusi yang sangat baik jika Anda memiliki lebih dari satu akun di domain yang sama, yang solusi lainnya tidak dapat ditangani dengan baik
Beka
1
Solusi yang bagus. Anda juga dapat menyederhanakan ini dengan> GIT_SSH = my_git_ssh_wrapper; git clone [email protected]: TheUser / TheProject.git
Shiva
2
Solusi ini juga mencakup situasi ketika Anda ingin menggunakan git dari akun tanpa direktori home.
piotrekkr
Fantastis. Anda dapat menggunakan cara ini ke server pribadi juga:GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
ton
1
Ini adalah satu-satunya cara yang bekerja untuk saya di lingkungan cygwin
ChatterOne
113

Dengan git 2.10+ (Q3 2016: dirilis September 2d, 2016), Anda memiliki kemungkinan untuk menetapkan konfigurasi untuk GIT_SSH_COMMAND(dan bukan hanya variabel lingkungan seperti yang dijelaskan dalam Rober Jack Will 's jawaban )

Lihat komit 3c8ede3 (26 Jun 2016) oleh Nguyễn Thái Ngọc Duy ( pclouds) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit dc21164 , 19 Jul 2016)

Variabel konfigurasi baru core.sshCommandtelah ditambahkan untuk menentukan nilai apa yang GIT_SSH_COMMANDharus digunakan per repositori.

core.sshCommand:

Jika variabel ini disetel, git fetchdan git pushakan menggunakan perintah yang ditentukan alih-alih sshketika mereka perlu terhubung ke sistem jarak jauh.
Perintah ini dalam bentuk yang sama dengan GIT_SSH_COMMANDvariabel lingkungan dan diganti ketika variabel lingkungan diatur.

Artinya git clonebisa:

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

Anda bahkan dapat mengaturnya hanya untuk satu perintah:

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

Ini lebih mudah daripada mengatur GIT_SSH_COMMANDvariabel lingkungan, yang, pada Windows, seperti dicatat oleh Mátyás Kuti-Kreszács , akan menjadi

set "GIT_SSH_COMMAND=ssh -i private_key_file"
VONC
sumber
@Flimm tanggal rilis: calendar.google.com/calendar/…
VonC
Telah dirilis.
Flimm
4
Bekerja Orang-orang harus menganggap ini jawaban terbaik. Setelah dikeluarkan, dapat menjadi informatif untuk melakukan diff file .git / config dengan versi yang disalin ke / tmp sebelumnya. Entri baru telah dibuat: sshCommand = ... Untuk apa nilainya, saya menggunakan 'git config core.sshCommand "ssh -i $ HOME / .ssh / privatekeyfile".
WeakPointer
1
@ Spanky Anda dapat melakukan perintah inline git -c core.sshCommand="ssh -i private_key_file" clone host:repo.gitdiikuti oleh set konfigurasigit config core.sshCommand 'ssh -i private_key_file'
dav_i
1
Ini jelas merupakan jawaban terbaik!
Wagner Patriota
111

Untuk meringkas jawaban dan komentar , cara terbaik untuk mengatur git untuk menggunakan file kunci yang berbeda dan kemudian melupakannya, yang juga mendukung pengguna yang berbeda untuk host yang sama (misalnya akun GitHub pribadi dan yang berfungsi), yang bekerja pada Windows juga, untuk mengedit ~/.ssh/config(atau c:\Users\<your user>\.ssh\config) dan menentukan beberapa identitas:

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

Kemudian, untuk mengkloning proyek sebagai pengguna pribadi Anda, jalankan git cloneperintah biasa .

Untuk mengkloning repo sebagai workuser, jalankan git clone git@github-work:company/project.git.

Dan Dascalescu
sumber
3
Saya menurunkan Anda karena semua yang Anda katakan sudah tercakup dalam jawaban di atas, dan di mata saya, bahkan lebih jelas. Misalnya, mengapa Anda masing-masing mendefinisikan Pengguna menjadi e dandv dan workuser?
hroptatyr
2
Anda menjawab pertanyaan berusia 4 tahun tanpa informasi baru dan Anda mengklaim bahwa jawaban Anda adalah "jalan terbaik". Terlebih lagi Anda menurunkan dan mengacaukan pengguna lain untuk menghapus jawaban mereka ... hanya untuk mendorong Anda.
rudimeier
@hroptatyr: Saya telah menggunakan dandvdan workuseruntuk mendukung contoh saya, "mis. akun GitHub pribadi dan akun kerja". dandvadalah nama pengguna GitHub saya.
Dan Dascalescu
12
Saya pikir itu jawaban yang lebih baik daripada @ thamster, jika hanya karena itu menjelaskan alias host.
David Moles
2
Saya suka jawaban ini. Namun, bagi saya ini hanya berfungsi jika saya menambah IdentitiesOnly yesfile konfigurasi ssh saya.
winni2k
75

Seperti yang dinyatakan di sini: https://superuser.com/a/912281/607049

Anda dapat mengonfigurasinya per-repo:

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
David
sumber
1
Apa yang -F /dev/nullharus dilakukan Sejauh yang saya bisa lihat ini akan mengubah configFile dari ~/.ssh/configdefault tetapi mengapa itu diinginkan? Untuk memastikan perintah kotak pasir?
Dominic
3
linuxcommand.org/man_pages/ssh1.html , menentukan tidak ada file konfigurasi, jadi ketika git akan menjalankan ssh, tidak ada file konfigurasi yang akan diteruskan (sebenarnya ini semacam mode kotak pasir, abaikan saja opsi konfigurasi standar pengguna) Thread asli di superuser memiliki info lebih lanjut tentang -F
David
1
Yang saya cari. Terima kasih!
Lostcitizen
Solusi AAAAA + untuk bekerja di lingkungan kuber. Terima kasih!
Cobra vs Ninja
1
Hai Apakah Anda tahu cara menyebarkan ini ke submodule?
Arka Prava Basu
38

Masalahnya adalah ketika Anda memiliki repositori jarak jauh yang berbeda pada host yang sama (katakanlah github.com), dan Anda ingin berinteraksi dengannya menggunakan kunci ssh yang berbeda (yaitu akun GitHub yang berbeda).

Untuk melakukan itu:

  1. Pertama, Anda harus mendeklarasikan kunci yang berbeda dalam ~/.ssh/configfile.

    # 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

    Dengan melakukan ini, Anda mengasosiasikan kunci kedua dengan nama ramah baru "XXX" untuk github.com.

  2. Maka Anda harus mengubah asal remote repositori tertentu Anda, sehingga ia menggunakan nama ramah yang baru saja Anda tetapkan.

    Pergi ke folder repositori lokal Anda di dalam prompt perintah, dan tampilkan asal jarak jauh saat ini:

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

    Kemudian ubah asal dengan:

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

    Sekarang Anda dapat menekan, mengambil ... dengan tombol kanan secara otomatis.

rodzmkii
sumber
1
Ini adalah jawaban yang paling "benar" dalam pikiran saya, di mana Anda mengatur koneksi dan kunci dalam file konfigurasi ssh Anda yang merupakan praktik terbaik dan jangka panjang yang dapat didukung.
jamescampbell
Solusi lain tampak seperti solusi, ini menggunakan fitur hebat yang didukung alat ini.
Craig.C
Luar biasa, persis apa yang saya cari, terima kasih !!
magikMaker
37
GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo

atau

export GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key"
git clone REPO
git push
carlsborg
sumber
Yang ini berhasil untuk saya.
mohammed_ayaz
36

Gagasan yang lebih baik untuk menambahkan host atau ip ke .ssh/configfile seperti:

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)
hamster
sumber
1
Itu berguna, tetapi membuat Anda menggunakan kunci repo untuk semua interaksi dengan nama host itu. Jika ada repo lain di server yang sama yang memerlukan kunci berbeda, menggunakan pembungkus dan memberitahu git untuk menggunakannya dengan GIT_SSH lebih baik.
Joe Block
11
Itu belum tentu benar. Saya menggunakan beberapa kunci untuk Github - satu untuk pekerjaan dan satu untuk akun pribadi saya. Anda tidak harus memasukkan nama domain untuk "Host". Anda dapat memasukkan segala jenis alias yang Anda inginkan. Sebagai contoh, saya menggunakan gh-home dan gh-work sebagai nama host saya dan ketika saya mengkloning saya menggunakan, misalnya, git clone git@gh-work:repo/project.git Dalam ~ / .ssh / config saya memiliki dua bagian yang keduanya menggunakan github.com untuk HostName. Mereka hanya memiliki IdentityFile dan Host yang berbeda
blockloop
@ brettof86 strategi ini berfungsi sebagian besar, tetapi apa yang Anda lakukan ketika repositori yang Anda periksa tergantung pada permata yang juga di-host di github? Referensi ke repo github di Gemfile tidak akan berisi "alias" Anda, tidak kecuali Anda ingin memecahkan hal-hal untuk pengembang lain pada proyek ...
ktec
@ brettof86 Saya juga punya dua akun github yang berbeda (kantor, rumah), tetapi saya tidak bisa mendapatkan contoh yang berfungsi untuk saya. Bisakah Anda memposting sampel memiliki dua?
Climbs_lika_Spyder
@Climbs_lika_Spyder inilah yang ada di ~/.ssh/config pastebin.com/8rYn7yCi
blockloop
32

Saya menggunakan variabel lingkungan GIT_SSH. Inilah pembungkus saya, mirip dengan yang dari Joe Block dari atas, tetapi menangani sejumlah argumen.

File ~ / gitwrap.sh

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

Kemudian, di .bashrc saya, tambahkan berikut ini:

export GIT_SSH=~/gitwrap.sh
Jamie
sumber
Saya telah mengatur ini di .bashrc. Tetapi ketika saya login ke openshift instance, sepertinya tidak memanggilnya. Apakah saya melewatkan sesuatu?
Jigar Shah
Gagal dengan kesalahan untuk saya .. tidak dapat menemukan acara skrip meskipun ada di sana .. tidak yakin apa yang terjadi ... kesalahan: tidak dapat menjalankan /tmp/gitwrap.sh: Tidak ada file atau direktori seperti itu
ap1234
Jika Anda menghadapi kesalahan "Tidak ada file atau direktori", letakkan path lengkap gitwrap.sh, misalnya/home/ubuntu/gitwrap.sh
Tahir Akhtar
Anda mungkin ingin menambahkan -o StrictHostKeyChecking=noperintah ssh
dan-man
12

Jika tidak ada solusi lain di sini yang berfungsi untuk Anda, dan Anda telah membuat beberapa ssh-keys, tetapi masih tidak dapat melakukan hal-hal sederhana seperti

git pull

kemudian dengan asumsi Anda memiliki dua file kunci ssh seperti

id_rsa
id_rsa_other_key

lalu di dalam git repo, coba:

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

dan juga pastikan nama pengguna dan userid default github Anda benar dengan:

# Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "[email protected]"

Lihat https://gist.github.com/jexchan/2351996 untuk informasi lebih lanjut.

cgnorthcutt
sumber
Perhatikan jika Anda mendapatkan Could not open a connection to your authentication agent., coba $ eval `ssh-agent -s`, dan coba lagi.
cgnorthcutt
1
Bagi mereka yang tersesat, ssh-addtrik perintahnya bekerja untuk saya. Tambahkan kunci identitas ke daftar yang dicoba ketika ssh mengautentikasi. Ini bekerja dengan baik untuk saya!
Ben Cartwright
Menurut Anda mengapa itu penting di direktori mana Anda menjalankan ssh-add?
tripleee
@BenCartwright Karena Anda mengubah pengaturan lokal, bukan pengaturan global. Pendekatan ini memodifikasi .gitdi dalam repo bukan program git secara global. Anda dapat menggunakan --globaluntuk mengatur nama pengguna dan email global.
cgnorthcutt
11

Ketika Anda perlu terhubung ke github dengan permintaan normal ( git pull origin master), pengaturan Host sebagai *di ~/.ssh/configbekerja untuk saya, setiap host lain (misalnya, "github" atau "gb") tidak bekerja.

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx
chopstik
sumber
Mungkin juga biarkan seluruh baris "Host *" keluar.
lionello
1
Mungkin tidak berfungsi karena tidak cocok dengan URL jarak jauh Anda. Jika Anda ingin menggunakan Host my-host-alias, Anda harus mengatur remote.origin.url=git@my-host-alias:[username]/[repo].git.
David Moles
11

Banyak dari solusi ini terlihat menarik. Namun, saya menemukan pendekatan generik git-wrapping-script di tautan berikut menjadi yang paling berguna:

Cara Menentukan File Kunci ssh dengan gitperintah

Intinya adalah bahwa tidak ada gitperintah seperti berikut:

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

Solusi Alvin adalah menggunakan skrip bash-wrapper yang didefinisikan dengan baik yang mengisi celah ini:

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

Dimana 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 "$@"

Saya dapat memverifikasi bahwa ini memecahkan masalah yang saya alami dengan user / pengakuan kunci untuk repo bitbucket jauh dengan git remote update, git pull, dan git clone; yang semuanya sekarang berfungsi dengan baik dalamcron skrip pekerjaan yang sebelumnya mengalami kesulitan menavigasi shell-terbatas. Saya juga dapat memanggil skrip ini dari dalam R dan masih menyelesaikan cronmasalah eksekusi yang sama persis (misalnya system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")).

Bukan berarti R sama dengan Ruby, tetapi jika R dapat melakukannya ... O :-)

Paul McMurdie
sumber
1
Tampak hebat! Saya akan menguji ini dan membalasnya.
BlueBird
3
Terlepas dari sintaks, bagaimana ini lebih baik dari GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone [email protected]:/git/repo.gitper jawaban Robert Jack Will ?
David Moles
6

jika Anda memiliki direktori di jalur Anda di mana Anda ingin masuk dengan file identfikasi yang diberikan, Anda dapat menentukan untuk menggunakan file identifikasi spesifik melalui file .ssh / config dengan mengatur ControlPathmisalnya:

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

Kemudian sshakan menggunakan file identitas yang ditentukan saat melakukan perintah git di bawah jalur kerja yang diberikan.

cristobal
sumber
Mengetahui nanti bahwa Anda juga dapat mengatur properti ControlMaster autodan ControlPersist yes, sehingga Anda tidak perlu mengetik ulang kata sandi setiap waktu. Temukan info di artikel
cristobal
3

Anda perlu membuat ~ / .ssh / config seperti di bawah ini

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

izin seperti di bawah ini

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

Tambahkan kunci publik Anda ke git Anda (cat ~ / .ssh / id_rsa_pub [atau nama simillar])

dan kemudian git klon seperti di bawah ini

git clone ssh://blahblah@blah.com/userid/test.git
gajanan malvade
sumber
3

Banyak jawaban yang baik, tetapi beberapa dari mereka mengasumsikan pengetahuan administrasi sebelumnya.

Saya pikir itu adalah penting untuk secara eksplisit menekankan bahwa jika Anda memulai proyek Anda dengan kloning URL web - https://github.com/<user-name>/<project-name>.git
maka Anda perlu memastikan bahwa yang url nilai di bawah [remote "origin"]di .git/config diubah ke URL SSH (lihat blok kode di bawah ini).

Dengan tambahan itu pastikan Anda menambahkan sshCommmandseperti yang disebutkan di bawah ini:

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

Baca lebih lanjut di sini .

RtmY
sumber
1
Terima kasih banyak, menghabiskan banyak waktu untuk mencari tahu mengapa git tidak menggunakan kunci ssh. Saya tidak mengerti mengapa github memberikan https url sebagai default di tombol klon.
Chakradar Raju
2

Di Windows dengan Git Bash Anda dapat menggunakan yang berikut ini untuk menambahkan repositori ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' misalnya: ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin [email protected]:test/test.git'Kunci privat apa yang ada di drive D, folder test komputer. Juga jika Anda ingin mengkloning repositori, Anda dapat mengubahnya git remote add origindengangit clone .

Setelah memasukkan ini ke Git Bash, itu akan meminta Anda untuk frasa sandi!

Waspadalah yang membuka kunci pribadi dan kunci pribadi dempul berbeda!

Jika Anda telah membuat kunci Anda dengan puttygen, Anda harus mengonversi kunci pribadi Anda menjadi openssh!

Peyman Mahdavi
sumber
1

Anda dapat menggunakan variabel lingkungan GIT_SSH. Tetapi Anda harus membungkus ssh dan opsi menjadi skrip shell.

Lihat git manual: man gitdi shell perintah Anda.

rudimeier
sumber
1

Saya menggunakan zshdan kunci yang berbeda dimuat ke shell zsh saya ssh-agentsecara otomatis untuk keperluan lain (yaitu akses ke server jauh) di laptop saya. Saya memodifikasi jawaban @ Nick dan saya menggunakannya untuk salah satu repo saya yang perlu disegarkan sesering mungkin. (Dalam hal ini saya dotfilesyang ingin versi yang sama dan terbaru di semua mesin saya, di mana pun saya bekerja.)

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
  • Munculkan agen ssh
  • Tambahkan kunci baca-saja ke agen
  • Ubah direktori menjadi repositori git saya
  • Jika cd repo dir berhasil, tarik dari repo jarak jauh
  • Bunuh ssh-agent yang muncul. (Aku tidak ingin banyak agen tetap hidup.)
sdkks
sumber
1

untuk gitlab RSAAuthentication yes

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

doc ada di sini

Alupotha
sumber
tampaknya tidak disebutkan pada tautan yang Anda berikan lagi
rbennell
1

Agar GIT_SSH_COMMAND variabel lingkungan berfungsi di bawah Windows alih-alih:

set GIT_SSH_COMMAND="ssh -i private_key_file"

Menggunakan:

set "GIT_SSH_COMMAND=ssh -i private_key_file"

Kutipan harus seperti

set "variable=value" 

Beberapa backgorund: https://stackoverflow.com/a/34402887/10671021

Mátyás Kuti-Kreszács
sumber
0

Jika nomor port SSH tidak 22 (default), tambahkan Port xxdi~/.ssh/config

Dalam kasus saya (synology),

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

Kemudian klon menggunakan judul Host di config. ("my_synology". untuk menghindari "*" dari @chopstik)

git clone my_synology:path/to/repo.git
w..k
sumber
0

Jika Anda seperti saya, Anda dapat:

  • Biarkan kunci ssh Anda teratur

  • Buat perintah git clone Anda sederhana

  • Tangani sejumlah kunci untuk sejumlah repositori.

  • Kurangi perawatan kunci ssh Anda.

Saya menyimpan kunci saya di ~/.ssh/keysdirektori saya .

Saya lebih suka konvensi daripada konfigurasi.

Saya pikir kode adalah hukum; semakin sederhana, semakin baik.

LANGKAH 1 - Buat Alias

Tambahkan alias ini ke shell Anda: alias git-clone='GIT_SSH=ssh_wrapper git clone'

LANGKAH 2 - Buat Skrip

Tambahkan skrip ssh_wrapper ini ke PATH Anda:

#!/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}" "$@"

CONTOH

Gunakan kunci github.com/l3x:

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

Contoh berikut juga menggunakan kunci github.com/l3x (secara default):

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

Gunakan kunci bitbucket.org/lsheehan:

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

CATATAN

Ubah SSH_KEY default di skrip ssh_wrapper menjadi apa yang paling sering Anda gunakan. Dengan begitu, Anda tidak perlu menggunakan variabel KEY sebagian besar waktu.

Anda mungkin berpikir, "Hei! Itu banyak terjadi dengan alias, skrip dan beberapa direktori kunci," tetapi bagi saya itu adalah konvensi. Hampir semua workstation saya (dan server dalam hal ini) dikonfigurasi dengan cara yang sama.

Tujuan saya di sini adalah menyederhanakan perintah yang saya jalankan secara teratur.

Konvensi saya, misalnya, skrip Bash, alias, dll., Menciptakan lingkungan yang konsisten dan membantu saya menyederhanakannya.

KISS dan masalah nama.

Untuk tips desain lainnya, lihat Bab 4 SOLID Design in Go dari buku saya: https://www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW

Semoga itu bisa membantu. - Lex

l3x
sumber
0

Anda dapat mencoba paket sshmulti npm untuk mempertahankan beberapa kunci ssh.

Anto Khan
sumber
0

Masalah dengan metode ini adalah, setidaknya ketika dijalankan oleh bash.exe di Windows, itu akan membuat proses baru setiap kali yang akan tetap tidak aktif.

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git'

Jika Anda ingin menggunakannya untuk repro syncig sesuai jadwal maka Anda perlu menambahkan "&& ssh-agent -k" di bagian akhir.

Sesuatu seperti:

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 akan membunuh prosesnya ketika sudah selesai.

Mike Zygal
sumber
0

Saya hanya perlu menambahkan kunci lalu menjalankan git clone lagi.

ssh-add ~/.ssh/id_rsa_mynewkey
git clone git@bitbucket.org:mycompany/myrepo.git
Rafael Corrêa Gomes
sumber
-1

Inilah hack kunci ssh yang saya temukan saat menemukan solusi untuk masalah ini:

Misalnya Anda memiliki 2 set kunci yang berbeda:

key1, key1.pub, key2, key2.pub

Simpan kunci-kunci ini di .sshdirektori Anda

Sekarang di file Anda .bashrcatau .bash_profilealias, tambahkan perintah ini

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'

Voila! Anda memiliki pintasan untuk berganti tombol kapan pun Anda mau!

Semoga ini berhasil untuk Anda.

penduDev
sumber