Pertanyaan Bagaimana cara memberi tahu kunci pribadi mana yang harus digunakan?


ssh memiliki -i opsi untuk memberi tahu file kunci pribadi mana yang akan digunakan saat mengautentikasi:

-i identity_file

    Pilih file dari mana   identitas (kunci pribadi) untuk otentikasi RSA atau DSA dibaca.   Standarnya adalah ~/.ssh/identity untuk versi protokol 1,   dan ~/.ssh/id_rsa dan ~/.ssh/id_dsa untuk versi protokol 2.   File identitas juga dapat ditentukan berdasarkan per-host   dalam file konfigurasi. Dimungkinkan untuk memiliki banyak -i pilihan    (dan banyak identitas yang ditentukan dalam file konfigurasi).

Apakah ada cara yang serupa untuk diceritakan git file kunci pribadi yang akan digunakan pada sistem dengan beberapa kunci privat di ~/.ssh direktori?


464
2018-01-12 18:20


asal


Lihat pertanyaan ini di StackOverflow demikian juga. - Flimm
Juga terkait serverfault.com/questions/194567/… - Machavity


Jawaban:


Di ~/.ssh/config, tambahkan:

host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github
 User git

Sekarang Anda bisa melakukannya git clone git@github.com:username/repo.git.

CATATAN: Verifikasi bahwa izin pada IdentityFile adalah 400.SSH akan menolak, dengan cara eksplisit tidak jelas, kunci SSH yang terlalu mudah dibaca. Itu hanya akan terlihat seperti penolakan kredensial. Solusinya, dalam hal ini, adalah:

chmod 400 ~/.ssh/id_rsa_github

516
2018-01-12 19:36



Bagaimana jika Anda perlu terhubung ke host yang sama dengan kunci yang berbeda? - Valentin Klinghammer
@Quelltextfabrik - Anda dapat menambahkan bagian lain dengan Host yang berbeda: nerderati.com/2011/03/… - Ben Challenor
@Cliff Nop, di halaman manual saya: "HostName: Menentukan nama host asli untuk masuk. Ini dapat digunakan untuk menentukan nama panggilan atau singkatan untuk host. "Versi ssh saya adalah openssh-6.7p1. - Grissiom
@Grissiom Itulah tepatnya yang dikatakannya. Tapi Anda tampaknya mengerti arti ke belakang. Host (atau Pertandingan) diperlukan. Untuk membuat julukan tuan rumah, Anda menempatkan nama panggilan di baris Inang dan nama host asli di baris HostName. Contoh: saltycrane.com/blog/2008/11/… - Cliff
Jika file konfigurasi baru, jangan lupa untuk melakukannya chmod 600 ~/.ssh/config - elysch


Variabel lingkungan GIT_SSH_COMMAND:

Dari Git versi 2.3.0, Anda dapat menggunakan variabel lingkungan GIT_SSH_COMMAND seperti ini:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example

Perhatikan itu -i kadang-kadang dapat diganti oleh file konfigurasi Anda, dalam hal ini, Anda harus memberi SSH file konfigurasi kosong, seperti ini:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example

Konfigurasi core.sshCommand:

Dari Git versi 2.10.0, Anda dapat mengonfigurasi ini per repo atau secara global, jadi Anda tidak perlu mengatur variabel lingkungan lagi!

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

216
2018-05-08 09:43



Saya harus mengekspor kulit variabel ke variabel lingkungan untuk membuat karya ini, yaitu export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example", kemudian git clone example - Abdull
@Abdull In Bash, melakukan tugas pada baris yang sama dengan perintah mengekspor variabel lingkungan hanya untuk perintah itu. Cobalah: example=hello /usr/bin/env | grep example. - Flimm
semuanya menjadi lebih baik: mulai dari Git 2.10, Anda dapat menyimpan perintah dalam konfigurasi Git Anda: stackoverflow.com/a/38474220/520162 - eckes
@Nititart /dev/null hanya nama file yang valid dalam sistem operasi mirip UNIX, tidak berfungsi pada Windows. - Flimm
Jika Anda memerlukan banyak kunci, parameter -i dapat diulang, dan ssh akan mencoba setiap tombol secara bergiliran. git config core.sshcommand "ssh -i /path/to/keyA -i /path/to/keyB". Ini memungkinkan git menggunakan kunci yang berbeda dengan host jarak jauh yang berbeda. - Mark


Ada tidak langsung cara untuk memberi tahu git kunci pribadi mana yang akan digunakan, karena bergantung pada ssh untuk autentikasi repositori. Namun, masih ada beberapa cara untuk mencapai tujuan Anda:

Pilihan 1: ssh-agent

Kamu dapat memakai ssh-agent untuk sementara memberi otorisasi kunci pribadi Anda.

Sebagai contoh:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

Pilihan 2: GIT_SSH_COMMAND

Berikan argumen ssh dengan menggunakan GIT_SSH_COMMAND variabel lingkungan (Git 2.3.0+).

Sebagai contoh:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

Anda dapat mengetik ini semua dalam satu baris - abaikan $ dan tinggalkan \.

Opsi 3: GIT_SSH

Berikan argumen ssh dengan menggunakan GIT_SSH variabel lingkungan untuk menentukan alternatif ssh biner.

Sebagai contoh:

$ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH='./ssh' git clone user@host

Catatan: Baris di atas adalah baris perintah shell (terminal) yang harus Anda tempelkan ke terminal Anda. Mereka akan membuat file bernama ssh, membuatnya dapat dieksekusi, dan (secara tidak langsung) menjalankannya.

catatan: GIT_SSH tersedia sejak v0.99.4 (2005).

Opsi 4: ~/.ssh/config

Menggunakan ~/.ssh/config file seperti yang disarankan dalam jawaban lain untuk menentukan lokasi kunci pribadi Anda, mis.

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa

62
2018-01-23 22:08



//, Bagaimana jika identitas Anda di ssh-agent diteruskan, seperti pada pertanyaan ini? superuser.com/questions/971732/… - Nathan Basanese
Saya telah mengizinkan saya memformat ulang postingan ini: IMO ini adalah jawaban yang paling komprehensif. Dalam desain aslinya, pemindaian cepat menyarankan pos di mana menggambarkan satu solusi rumit untuk masalah, jadi saya melewatkannya. - Alberto
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host' bekerja untuk saya ketika tidak ada yang lain. Pujian. - Daniel Dewhurst
Saya harus menggunakannya ~/.ssh/config metode, env vars tidak bekerja untuk saya ... - Greg Dubicki
GIT_SSH tersedia sejak v0.99.4 (Agustus 2005), jadi pada dasarnya sejak Git ada (April 2005). - Dominik


Tulis skrip yang memanggil ssh dengan argumen yang Anda inginkan, dan masukkan nama file dari skrip di $GIT_SSH. Atau cukup tempatkan konfigurasi Anda ~/.ssh/config.


32
2018-01-12 18:25



Penjelasan lain tentang bagaimana melakukan ini. - Sithsu
~/.ssh/config Aku s itu jalan untuk pergi. - hek2mgl
Saya bekerja pada mesin (A) dari mana saya git push ke server (B) yang hanya menerima otentikasi kunci ssh. Sementara setup ~ / .ssh / config saya di (A) bekerja dengan sangat baik ketika saya bekerja secara langsung di mesin itu, tidak ketika saya login dari beberapa lokasi lain (C). Menggunakan $GIT_SSH dan skrip memecahkan masalah ini. Terima kasih! - bsumirak


Jika Anda tidak ingin harus menentukan variabel lingkungan setiap kali Anda menjalankan git, tidak ingin skrip wrapper lain, jangan / tidak dapat menjalankan ssh-agent (1), atau tidak ingin mengunduh paket lain hanya untuk ini, gunakan git -remote-ext (1) transportasi eksternal:

$ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
Cloning into 'repository'
(...)
$ cd repository
$ git remote -v
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (push)

Saya menganggap solusi ini superior karena:

  • Ini adalah repositori / spesifik remote
  • Hindari membengkokkan naskah pembungkus
  • Tidak perlu agen SSH - berguna jika Anda ingin klon / dorongan / tarikan yang tidak dijaga (mis. Dalam cron)
  • Jelas, tidak ada alat eksternal yang dibutuhkan

14
2017-07-21 19:44



//, Solusi bagus. Namun saya bertanya-tanya, apakah ini akan memungkinkan seseorang untuk menentukan identitas yang dilewatkan menggunakan agen forwarding. Sebagian besar kunci saya tidak lokal ke server tempat saya menggunakannya. Saya bertanya tentang ini di sini: superuser.com/questions/971732/… - Nathan Basanese
Jawabannya hanya berurusan dengan cara menentukan baris perintah arbitrary untuk digunakan sebagai repositori git. IMHO, Anda harus mencoba untuk menyelesaikan masalah Anda menggunakan ssh sendiri terlebih dahulu (mis. "Ssh tuan rumah"Harus terhubung menggunakan kunci yang tepat. Saya akan mencoba memberikan info lebih lanjut tentang pertanyaan Anda yang lain. - flaviovs
Jawaban ini persis yang saya butuhkan untuk memaksa Chef git sumber daya untuk menggunakan tombol penyebaran spesifik repositori untuk mengkloning / mengambil dari repositori Github pribadi. Keuntungan tambahan dari metode ini di atas lingkungan / yang berbasis skrip adalah karena kunci-path dikodekan dalam konfigurasi kerja-repo, itu akan menggunakan kunci yang sama pada kedua clone awal dan fetches / pushes. - Adam Franco
WOW! Ini luar biasa, tidak tahu tentang ini. Terima kasih atas jawabannya, cukup membantu juga di lingkungan boneka, untuk mencegah kerumitan ekstra untuk dikelola .ssh/config dll. +1! - gf_
Jika Anda mengalami kesalahan berikut fatal: transport 'ext' not allowed, Anda harus memasukkan protokol ext melalui export GIT_ALLOW_PROTOCOL=ext. Pada dasarnya, git-remote-ext remote helper (yang mendukung "ext :: ssh example.com% S foo / repo" URL) memungkinkan eksekusi perintah sewenang-wenang. Ini biasanya tidak pernah menjadi perhatian karena pengguna selalu melihat dan mempercayai URL yang mereka berikan kepada git. Namun, submodul git, melalui file .gitmodules, memungkinkan penyerang untuk meminta klien untuk mengambil URL git sewenang-wenang. hackerone.com/reports/104465 - Gomino


Setelah perjuangan saya dengan $GIT_SSH Saya ingin berbagi apa yang berhasil untuk saya.

Melalui contoh-contoh saya, saya akan menganggap Anda memiliki kunci pribadi Anda yang terletak di/home/user/.ssh/jenkins

Kesalahan untuk dihindari: Nilai GIT_SSH menyertakan opsi

$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"

atau apa pun yang serupa akan gagal, seperti git akan mencoba mengeksekusi nilai sebagai file. Untuk alasan itu, Anda harus membuat skrip.

Contoh kerja dari skrip $ GIT_SSH /home/user/gssh.sh

Skrip akan dipanggil sebagai berikut:

$ $GIT_SSH [username@]host [-p <port>] <command>

Contoh skrip yang berfungsi dapat terlihat seperti:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins $*

Perhatikan $* pada akhirnya, itu bagian penting dari itu.

Bahkan alternatif yang lebih aman, yang akan mencegah kemungkinan konflik dengan apa pun di file konfigurasi default Anda (ditambah secara eksplisit menyebutkan port untuk digunakan) adalah:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins -F /dev/null -p 22 $*

Dengan asumsi skrip sudah masuk /home/user/gssh.sh, Anda kemudian akan:

$ export GIT_SSH=/home/user/gssh.sh

dan semua akan berfungsi.


13
2018-05-28 17:09



Terima kasih. Perhatikan: gunakan "$ @" sebagai ganti $ * untuk argumen pass-thru, karena argumen sebelumnya berperilaku dengan benar ketika argumen berisi spasi. - Piotr Findeisen
@PiotrFindeisen Terima kasih atas catatan Anda. Namun, saya tidak mengerti sepenuhnya - dalam zsh itu membantu saya untuk menjaga ruang dengan satu bagian, tetapi dalam bash tidak. Bisakah Anda memberi tahu saya lebih banyak atau menunjukkan beberapa penjelasan? Saya tidak ingin menambahkan beberapa modifikasi secara membabi buta. - Jan Vlcinsky
Anda harus menghapus separuh pertama jawaban Anda. Tidak ada yang tertarik dengan solusi yang tidak berhasil, dan terbuang pembacaan yang mengaburkan jawaban yang benar di bagian bawah, yang bekerja dengan sangat baik. - Cerin
@Cerin Jika Anda bermaksud menghapus "Kesalahan untuk dihindari", saya akan menyimpannya di sana. Ini berbagi perangkap umum untuk menghindari dan itu sangat pendek. Saya yakin, seseorang akan mencoba mengoptimalkan solusi dengan menyediakan semua hal ke dalam variabel (ini terjadi pada saya), jadi saya mencoba mempersingkat jalan menuju kesuksesan. - Jan Vlcinsky


Gunakan konfigurasi host khusus di ~/.ssh/config, seperti ini:

Host gitlab-as-thuc  
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.thuc
    IdentitiesOnly yes

kemudian gunakan nama host kustom Anda seperti ini:

git remote add thuc git@gitlab-as-thuc:your-repo.git  

6
2018-05-17 15:03



Ini adalah jawaban yang saya cari, karena saya memiliki akun GitHub terpisah untuk rumah dan kantor. Saya hanya harus mengatur Host work.github.com  HostName github.com  IdentityFile ~/.ssh/work, lalu ganti "github.com" oleh "work.github.com" setiap kali saya mengkloning repositori kerja. Masih terhubung ke "github.com", tetapi menggunakan pasangan kunci non-default. - Mikkel
URL untuk detail ("itblog.study.land / ... ") tidak berfungsi lagi :( - Carl Smotricz


Anda bisa menggunakan ssh-ident daripada membuat wrapper Anda sendiri.

Anda dapat membaca lebih lanjut di:    https://github.com/ccontavalli/ssh-ident

Ini memuat kunci ssh pada permintaan ketika pertama kali diperlukan, sekali, bahkan dengan beberapa sesi login, xterms atau NFS berbagi rumah.

Dengan file konfigurasi kecil, secara otomatis dapat memuat kunci yang berbeda dan memisahkannya dalam agen yang berbeda (untuk penerusan agen) tergantung pada apa yang perlu Anda lakukan.


5
2018-03-23 01:35