Agak situasi yang tidak biasa mungkin, tapi saya ingin menentukan pribadi SSH-key yang digunakan saat mengeksekusi shell (git) perintah dari komputer lokal.
Pada dasarnya seperti ini:
git clone [email protected]:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"
Atau bahkan lebih baik (Ruby):
with_key("/home/christoffer/ssh_keys/theuser") do
sh("git clone [email protected]:TheUser/TheProject.git")
end
Saya telah melihat contoh-contoh dari menghubungkan ke remote server dengan Net::SSH yang menggunakan tentukan kunci privat, tapi ini adalah sebuah perintah. Apakah itu mungkin?
Tidak ada solusi ini bekerja untuk saya.
Sebaliknya, saya menguraikan @Martin v. Löwis 's menyebutkan menetapkan config
file untuk SSH.
SSH akan terlihat bagi pengguna's ~/.ssh/config
file. Saya memiliki tambang setup seperti:
Host gitserv
Hostname remote.server.com
IdentityFile ~/.ssh/id_rsa.github
IdentitiesOnly yes # see NOTES below
Dan saya tambahkan remote repositori git:
git remote add origin git@gitserv:myrepo.git
Dan kemudian git perintah bekerja normal bagi saya.
git push -v origin master
CATATAN
IdentitiesOnly ya
diperlukan untuk mencegah SSH perilaku default pengiriman identitas file sesuai nama file default untuk masing-masing protokol. Jika anda memiliki sebuah file yang bernama ~/.ssh/id_rsa
yang akan mendapatkan mencoba SEBELUM anda ~/.ssh/id_rsa.github
tanpa pilihan ini.Referensi
Hal seperti ini harus bekerja (disarankan oleh orip):
ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git'
jika anda lebih suka subshells, anda bisa mencoba hal berikut (meskipun itu lebih rapuh):
ssh-agent $(ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git)
Git akan memanggil SSH yang akan menemukan agennya oleh variabel lingkungan; ini akan, pada gilirannya, memiliki kunci dimuat.
Selain itu, pengaturan RUMAH
juga dapat melakukan trik, asalkan anda bersedia untuk men-setup sebuah direktori yang berisi hanya .ssh
direktori sebagai RUMAH
; hal ini mungkin berisi identitas.pub, atau config pengaturan IdentityFile.
Mulai dari Git 2.3.0 kami juga memiliki perintah sederhana (tidak ada file konfigurasi yang diperlukan):
GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git
Anda mungkin perlu me-restart untuk layanan ssh pada mesin anda.
Untuk meringkas jawaban dan comments, cara terbaik untuk set up git untuk menggunakan kunci yang berbeda file dan kemudian lupa tentang hal itu, yang juga mendukung pengguna yang berbeda untuk host yang sama (misalnya personal akun GitHub dan bekerja satu), yang bekerja pada Windows juga, adalah untuk mengedit ~/.ssh/config
(atau c:\Users\<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 sebuah proyek sebagai pengguna pribadi anda, hanya berjalan biasa git clone
perintah.
Untuk clone repo sebagai workuser
, berlari git clone git@github-work:company/project.git
.
Dengan git 2.10+ (Q3 2016: dirilis September lalu. 2d, 2016), anda memiliki kemungkinan untuk mengatur konfigurasi untuk GIT_SSH_COMMAND
(dan tidak hanya variabel lingkungan seperti yang dijelaskan dalam Rober Jack Akan's jawaban)
Lihat melakukan 3c8ede3 (26 Jun 2016) oleh Nguyễn Tháaku Ngọc Duy (pclouds
).
(Digabung dengan Junio C Hamano -- gitster
-- di melakukan dc21164, 19 Jul 2016)
konfigurasi baru variabel
inti.sshCommand
telah ditambahkan ke tentukan nilai untuk GIT_SSH_COMMAND untuk menggunakan per repositori.
core.sshCommand:
Jika variabel ini ditetapkan,
git fetch
dangit push
akan menggunakan perintah yang ditentukan bukanssh
ketika mereka perlu untuk terhubung ke sistem remote. Perintah dalam bentuk yang sama sepertiGIT_SSH_COMMAND
variabel lingkungan dan diganti ketika variabel lingkungan diatur.
Itu berarti git clone
dapat:
cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file'
# later on
git clone host:repo.git
Cara yang lebih baik untuk menambahkan host atau ip ke .ssh/config
file 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)
Aku pergi dengan GIT_SSH variabel lingkungan. Berikut ini's my wrapper, mirip dengan yang dari Joe Blok dari atas, tetapi menangani setiap jumlah dari argumen.
File ~/gitwrap.sh
#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"
Kemudian, di saya .bashrc, tambahkan berikut:
export GIT_SSH=~/gitwrap.sh
Masalahnya adalah ketika anda memiliki berbeda remote repositori pada host yang sama (mengatakan github.com), dan anda ingin berinteraksi dengan mereka menggunakan berbeda ssh keys (berbeda yaitu GitHub account).
Dalam rangka untuk melakukan itu:
# 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 kedua key baru dengan nama "XXX" untuk github.com.
Pergi ke repositori lokal folder dalam command prompt, dan menampilkan jarak jauh asal:
>git remote -v
origin [email protected]:myuser/myrepo.git (fetch)
origin [email protected]:myuser/myrepo.git (push)
Kemudian perubahan, 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 kunci yang tepat secara otomatis.
Jika tidak ada solusi lain di sini bekerja untuk anda, dan anda telah membuat beberapa ssh-kunci, tapi masih tidak bisa melakukan hal-hal sederhana seperti
git pull
kemudian dengan asumsi anda memiliki dua kunci ssh file seperti
id_rsa
id_rsa_other_key
kemudian dalam repo git, 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 anda github default username dan userid yang benar oleh:
# 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 lebih informasi lebih lanjut.
Banyak dari solusi ini tampak menarik. Namun, saya menemukan generic git-wrapping-naskah pendekatan di link berikut untuk menjadi yang paling berguna:
Bagaimana untuk Menentukan Kunci ssh File dengan git
command
Intinya adalah bahwa tidak ada git
perintah seperti berikut:
git -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git
Alvin's solusi adalah dengan menggunakan didefinisikan bash-wrapper script yang mengisi kesenjangan ini:
git.sh -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git
Di mana git.sh
adalah:
#!/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 memastikan bahwa ini memecahkan masalah yang saya alami dengan pengguna/pengakuan kunci untuk remote bitbucket repo dengan git remote update
, git pull
, dan git clone
; semua yang sekarang bekerja dengan baik di cron job script yang dinyatakan mengalami kesulitan menavigasi terbatas-shell. Saya juga bisa panggil script ini dari dalam R dan memecahkan masih sama persis
cronmengeksekusi masalah (misalnya
system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")`).
Tidak bahwa R adalah sama seperti Ruby, tapi jika R dapat melakukannya... O:-)
Ketika anda perlu untuk terhubung ke github dengan permintaan yang normal (git pull asal guru
), pengaturan Host sebagai *
di ~/.ssh/config
bekerja untuk saya, setiap Host lain (misalnya, "github" atau "gb") wasn't bekerja.
Host *
User git
Hostname github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_xxx
Anda perlu membuat ~/.ssh/config seperti dibawah 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
Menambahkan kunci publik anda ke git (cat ~/.ssh/id_rsa_pub [or simillar nama])
dan kemudian git clone seperti di bawah ini
git clone ssh://[email protected]/userid/test.git
jika anda memiliki direktori di jalan anda di mana anda ingin untuk menandatangani dengan diberikan identifyfile anda dapat menentukan untuk menggunakan spesifik mengidentifikasi file melalui .ssh/config file dengan pengaturan ControlPath
misalnya:
host github.com ControlPath ~/Proyek/pekerjaan/** HostName github.com IdentityFile ~/.ssh/id_work Pengguna git
Kemudian ssh
akan gunakan ditentukan identitas file ketika melakukan perintah git bawah diberikan pekerjaan jalan.
Di Windows dengan Git Bash anda dapat menggunakan kode berikut untuk menambahkan repositori
ssh-agent bash -c 'ssh-add "tombol-alamat"; git remote add origin "rep-alamat",'
misalnya: ssh-agent bash -c 'ssh-add /d/uji/PrivateKey.ppk; git remote add origin [email protected]:test/test.git'
Yang kunci pribadi di drive D, folder test komputer. Juga jika anda ingin menduplikasi sebuah repositori, anda dapat mengubah git remote add origin
dengan git clone
.
Setelah memasukkan ini ke Git Bash, itu akan meminta anda untuk frasa sandi!
Diketahui bahwa openssh kunci pribadi dan dempul kunci pribadi adalah diiferent!
Jika anda telah membuat anda kunci dengan puttygen, anda harus mengkonversi kunci pribadi anda untuk openssh!