ssh
memiliki -i
opsi untuk memberi tahu file kunci pribadi mana yang akan digunakan ketika mengautentikasi:
-i identity_file
Memilih file dari mana identitas (kunci pribadi) untuk RSA atau otentikasi DSA dibaca. Standarnya adalah
~/.ssh/identity
untuk protokol versi 1, dan~/.ssh/id_rsa
dan~/.ssh/id_dsa
untuk protokol versi 2. File identitas juga dapat ditentukan berdasarkan per-host di file konfigurasi. Dimungkinkan untuk memiliki banyak-i
opsi (dan banyak identitas yang ditentukan dalam file konfigurasi).
Apakah ada cara serupa untuk mengetahui git
file kunci pribadi mana yang akan digunakan pada sistem dengan beberapa kunci pribadi dalam ~/.ssh
direktori?
ssh
git
authentication
private-key
jrdioko
sumber
sumber
Jawaban:
Di
~/.ssh/config
, tambahkan:Sekarang kamu bisa melakukannya
git clone [email protected]:username/repo.git
.CATATAN: Pastikan bahwa izin pada IdentityFile adalah 400. SSH akan menolak, dengan cara yang tidak jelas eksplisit, kunci SSH yang terlalu mudah dibaca. Itu hanya akan terlihat seperti penolakan kredensial. Solusinya, dalam hal ini, adalah:
sumber
HostName
: Menentukan nama host asli untuk login. Ini dapat digunakan untuk menentukan nama panggilan atau singkatan untuk host." Versi ssh saya adalah openssh-6.7p1.chmod 600 ~/.ssh/config
core.sshCommand
konfigurasi git. superuser.com/a/912281/162466Variabel lingkungan
GIT_SSH_COMMAND
:Dari Git versi 2.3.0, Anda dapat menggunakan variabel lingkungan
GIT_SSH_COMMAND
seperti ini:Perhatikan bahwa
-i
terkadang dapat ditimpa oleh file konfigurasi Anda, dalam hal ini, Anda harus memberikan SSH file konfigurasi kosong, seperti ini:Konfigurasi
core.sshCommand
:Dari Git versi 2.10.0, Anda dapat mengonfigurasi ini per repo atau secara global, sehingga Anda tidak perlu lagi mengatur variabel lingkungan!
sumber
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example"
, kemudiangit clone example
example=hello /usr/bin/env | grep example
./dev/null
hanya nama file yang valid di sistem operasi mirip UNIX, itu tidak bekerja di Windows.GIT_SSH_COMMAND
tidak bekerja sampai aku digunakanIdentitiesOnly
, seperti perintah ini:GIT_SSH_COMMAND="ssh -i ~/.ssh/mysubdir/id_rsa -o 'IdentitiesOnly yes'" git push
.Tidak ada cara langsung untuk mengetahui
git
kunci privat mana yang digunakan, karena ini bergantung padassh
otentikasi repositori. Namun, masih ada beberapa cara untuk mencapai tujuan Anda:Pilihan 1:
ssh-agent
Anda dapat menggunakan
ssh-agent
untuk sementara mengotorisasi kunci pribadi Anda.Sebagai contoh:
Pilihan 2:
GIT_SSH_COMMAND
Lewati argumen ssh dengan menggunakan
GIT_SSH_COMMAND
variabel lingkungan (Git 2.3.0+).Sebagai contoh:
Anda dapat mengetikkan ini semua dalam satu baris - abaikan
$
dan tinggalkan\
.Opsi 3:
GIT_SSH
Lewati argumen ssh dengan menggunakan
GIT_SSH
variabel lingkungan untuk menentukanssh
biner alternatif .Sebagai contoh:
Catatan: Baris di atas adalah baris perintah shell (terminal) yang harus Anda tempelkan ke terminal Anda. Mereka akan membuat file dengan nama
ssh
, membuatnya dapat dieksekusi, dan (secara tidak langsung) menjalankannya.Catatan:
GIT_SSH
tersedia sejak v0.99.4 (2005).Opsi 4:
~/.ssh/config
Gunakan
~/.ssh/config
file seperti yang disarankan dalam jawaban lain untuk menentukan lokasi kunci pribadi Anda, missumber
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'
bekerja untuk saya ketika tidak ada yang lain. Pujian.~/.ssh/config
metode, tetapi tidak bekerja untuk saya ...GIT_SSH
tersedia sejak v0.99.4 (Agustus 2005) , jadi pada dasarnya sejak Git ada (April 2005).Tulis skrip yang memanggil
ssh
argumen yang Anda inginkan, dan masukkan nama file skrip$GIT_SSH
. Atau cukup masukkan konfigurasi Anda~/.ssh/config
.sumber
~/.ssh/config
Apakah yang cara untuk pergi.$GIT_SSH
dan skrip memecahkan masalah ini. Terima kasih!Jika Anda tidak ingin harus menentukan variabel lingkungan setiap kali Anda menjalankan git, tidak ingin skrip pembungkus lain, tidak / tidak dapat menjalankan ssh-agent (1), atau ingin mengunduh paket lain hanya untuk ini, gunakan git -remote-ext (1) transportasi eksternal:
Saya menganggap solusi ini lebih unggul karena:
sumber
git
sumber daya Chef untuk menggunakan kunci penempatan khusus repositori untuk mengkloning / mengambil dari repositori pribadi Github. Keuntungan tambahan dari metode ini daripada yang berbasis lingkungan / skrip adalah bahwa karena jalur-kunci dikodekan dalam konfigurasi repo-kerja, itu akan menggunakan kunci yang sama pada kedua klon awal dan pengambilan / dorongan berikutnya..ssh/config
dll +1!ext
transportasi di setiap submodule agar rekursi orang tua berfungsi.fatal: transport 'ext' not allowed
, Anda harus memasukkan daftar putih protokol ext melaluiexport GIT_ALLOW_PROTOCOL=ext
. Pada dasarnya, git-remote-ext remote helper (yang mendukung URL "ext :: ssh example.com% S foo / repo") memungkinkan eksekusi perintah sewenang-wenang. Ini biasanya tidak pernah menjadi perhatian karena pengguna selalu melihat dan mempercayai URL yang diteruskan ke git. Namun git submodules, melalui file .gitmodules, memungkinkan penyerang meminta klien untuk mengambil URL git yang berubah-ubah. hackerone.com/reports/104465Gunakan konfigurasi host kustom
~/.ssh/config
, seperti ini:lalu gunakan nama host khusus Anda seperti ini:
sumber
Host work.github.com
HostName github.com
IdentityFile ~/.ssh/work
, dan kemudian mengganti "github.com" dengan "work.github.com" setiap kali saya mengkloning repositori kerja. Masih terhubung ke "github.com", tetapi menggunakan pasangan kunci non-default.~/.ssh/config
file. Setiap jawaban lainnya tidak mengetahui bagaimana Anda dapat mengatur host ketika Anda menambahkan asal, yang secara otomatis memungkinkan git untuk menggunakan file kunci yang benar. TERIMA KASIH!!Setelah perjuangan saya dengan
$GIT_SSH
saya ingin berbagi apa yang berhasil untuk saya.Melalui contoh saya, saya akan menganggap Anda memiliki kunci pribadi Anda di
/home/user/.ssh/jenkins
Kesalahan yang harus dihindari: Nilai GIT_SSH mencakup opsi
atau apa pun yang serupa akan gagal, karena git akan mencoba mengeksekusi nilai sebagai file . Karena itu, Anda harus membuat skrip.
Contoh skrip $ GIT_SSH yang berfungsi
/home/user/gssh.sh
Script akan dipanggil sebagai berikut:
Contoh kerja skrip dapat terlihat seperti:
Perhatikan
$*
pada bagian akhir, ini adalah bagian yang penting.Alternatif yang lebih aman, yang akan mencegah kemungkinan konflik dengan apa pun di file konfigurasi default Anda (plus menyebutkan port yang akan digunakan secara eksplisit) adalah:
Dengan asumsi skrip berada
/home/user/gssh.sh
, Anda harus:dan semua akan bekerja.
sumber
Anda bisa menggunakan ssh-ident daripada membuat pembungkus Anda sendiri.
Anda dapat membaca lebih lanjut di: https://github.com/ccontavalli/ssh-ident
Itu memuat kunci ssh sesuai permintaan saat pertama kali diperlukan, sekali, bahkan dengan beberapa sesi login, xterms atau NFS berbagi rumah.
Dengan file konfigurasi mungil, ia dapat secara otomatis memuat kunci yang berbeda dan memisahkannya di agen yang berbeda (untuk penerusan agen) tergantung pada apa yang perlu Anda lakukan.
sumber
Saya punya klien yang membutuhkan akun github terpisah. Jadi saya perlu menggunakan kunci terpisah hanya untuk proyek yang satu ini.
Solusi saya adalah menambahkan ini ke .zshrc / .bashrc saya:
Setiap kali saya ingin menggunakan git untuk proyek itu, saya mengganti "infogit" dengan git:
Bagi saya, lebih mudah diingat.
sumber
Jadi saya mengatur variabel env GIT_SSH ke
$HOME/bin/git-ssh
.Untuk mendukung agar konfigurasi repo saya menentukan identitas ssh yang akan digunakan,
~/bin/git-ssh
file saya adalah ini:Maka saya memiliki pengaturan konfigurasi git global:
Dan di dalam repositori git apa pun saya hanya bisa menetapkan
ssh.identity
nilai konfigurasi git lokal :Voila!
Jika Anda dapat memiliki alamat email yang berbeda untuk setiap identitas, itu menjadi lebih sederhana, karena Anda bisa memberi nama kunci Anda setelah alamat email Anda dan kemudian memiliki pengguna git config. Email mendorong pemilihan kunci dalam
~/bin/git-ssh
seperti ini:sumber
Solusi saya adalah ini:
buat skrip:
maka ketika Anda harus mengubah var run:
Jangan lupa titik ekstra !! ini membuat skrip mengatur environment vars !! --key dan --port adalah opsional.
sumber
Secara umum, Anda ingin menggunakannya
~/.ssh/config
untuk ini. Cukup pasangkan alamat server dengan kunci yang ingin Anda gunakan sebagai berikut:Host *
menunjukkan server apa pun, jadi saya menggunakannya untuk menetapkan~/.ssh/id_rsa
sebagai kunci default untuk digunakan.sumber
Saya membangun @shellholic dan utas SO ini dengan beberapa jati. Saya menggunakan GitHub sebagai contoh dan menganggap bahwa Anda memiliki kunci pribadi di
~/.ssh/github
(jika tidak, lihat utas SO ini ) dan bahwa Anda menambahkan kunci publik ke profil GitHub Anda (jika tidak lihat bantuan GitHub ).Jika perlu, buat file konfigurasi SSH baru di
~/.ssh/config
dan ubah izin menjadi 400Tambahkan ini ke
~/.ssh/config
file:Jika Anda sudah memiliki pengaturan jarak jauh, Anda mungkin ingin menghapusnya, jika tidak Anda masih akan diminta nama pengguna dan kata sandi:
Kemudian tambahkan remote ke repositori git, dan perhatikan titik dua di depan nama pengguna:
Dan kemudian perintah git bekerja secara normal, misalnya:
@HeyWatchThis pada utas SO ini menyarankan
IdentitiesOnly yes
untuk menambahkan untuk mencegah perilaku default SSH mengirim file identitas yang cocok dengan nama file default untuk setiap protokol. Lihat utas itu untuk informasi dan referensi lebih lanjut.sumber
Cukup gunakan
ssh-agent
danssh-add
perintah.Setelah menjalankan perintah di atas, Anda dapat menggunakan kedua tombol secara bersamaan. Ketik saja
untuk mengkloning repositori Anda.
Anda perlu menjalankan perintah di atas setelah Anda me-reboot mesin Anda.
sumber
Saya menggunakan git versi 2.16 dan saya tidak perlu satu skrip bahkan perintah konfigurasi atau modifikasi.
Dan git membaca ke tombol secara otomatis. Saya tidak bertanya apa-apa dan itu tidak menimbulkan kesalahan. Hanya bekerja dengan baik.
sumber
~/.ssh
direktori"?Meskipun pertanyaannya tidak meminta, saya menyertakan jawaban ini untuk orang lain yang ingin menyelesaikan masalah yang sama hanya khusus untuk gitlab .
Solusi gitlab
Saya mencoba menggunakan pendekatan variabel lingkungan , tetapi bahkan dokumentasi git merekomendasikan
~/.ssh/config
untuk menggunakan apa pun selain kasus sederhana. Dalam kasus saya, saya mendorong ke server gitlab - dan saya ingin melakukannya sebagai pengguna tertentu - yang tentu saja ditentukan oleh kunci pribadi selama otentikasi dan bukan nama penggunagit
. Setelah diimplementasikan saya cukup melakukan hal berikut:Mempersiapkan
Ingat lokasi kunci pribadi Anda
/myfolder/.ssh/my_gitlab_id_rsa
dalam kasus saya.Tambahkan entri di
~/.ssh/config
:Tambahkan alias git di
~/.gitconfig
:Sebagai bonus, saya melakukan komit saya pada host yang sama dengan pengguna khusus dengan alias git ini :
Penjelasan
Semua hal di atas mengasumsikan remote yang relevan adalah
origin
dan cabang yang relevan sedang diperiksa. Untuk referensi saya menemukan beberapa item yang perlu ditangani:gitlab_as_me
, dan saya tidak suka melihat remote tambahan berkeliaran di pohon log saya jadi saya menghapusnya ketika selesaigitlab_as_me
Anda harus spesifik tentang apa cabang yang Anda dorongorigin
pointer lokal Anda harus "diperbarui" untuk mencocokkangitlab_as_me
(git pull origin $branch
apakah ini)sumber
Masukkan jalur yang ingin Anda simpan (Mis: my-pc / Desktop / .ssh / ed25519)
Tambahkan kunci publik ke gitlab Anda ( Cara menambahkan kunci ssh ke gitlab )
sumber
sumber