Meneruskan opsi ssh ke git clone

103

Saya mencoba menjalankan git clonetanpa ssh memeriksa kunci host repositori. Saya bisa melakukannya dari ssh seperti itu:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@host

Apakah ada cara untuk meneruskan opsi ssh yang sama ke perintah git clone?

Sunting: Ada batasan yang tidak dapat saya ubah ~/.ssh/configatau file lain di mesin itu.

Daniel
sumber
2
Apa yang Anda coba lakukan sangat berisiko dan Anda mungkin sebaiknya tidak melakukannya. Menonaktifkan verifikasi jika identitas server SSH jarak jauh adalah ide yang buruk dalam banyak situasi. Anda secara efektif menonaktifkan semua keamanan yang diperoleh melalui penggunaan SSH dan membuka diri terhadap serangan man-in-the-middle.
aef
1
Sebenarnya, seringkali inilah yang ingin Anda lakukan. Anda memiliki repo internal. Jika seseorang berhasil menipu itu, maka Anda dalam masalah. Ini sama sekali tidak "berisiko". Sebenarnya seberapa sering Anda melakukan pemeriksaan out-of-band terhadap kunci host? (Anda harus).
Graham Nicholls

Jawaban:

47

Tambahkan mereka ke ~/.ssh/config:

Host host
    HostName host
    User user
    SshOption1 Value1
    SshOption2 Value2

The Hostmasuk adalah apa yang akan Anda tentukan pada baris perintah, dan HostNameadalah nama host yang benar. Mereka bisa sama, atau Hostentri bisa menjadi alias. The Userentri digunakan jika Anda tidak menentukan user@pada baris perintah.

Jika Anda harus mengonfigurasi ini di baris perintah, setel GIT_SSHvariabel lingkungan untuk mengarah ke skrip dengan opsi Anda di dalamnya.

Josh Lee
sumber
4
Saya lupa mengatakan bahwa saya tidak dapat mengubah file apa pun di mesin itu. Jika tidak, ya solusi Anda akan berhasil.
Daniel
28
Gunakan GIT_SSHvariabel lingkungan.
Josh Lee
152

Git 2.3 yang baru dirilis mendukung variabel baru "GIT_SSH_COMMAND" yang dapat digunakan untuk menentukan perintah DENGAN parameter.

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@host

$GIT_SSH_COMMANDdiutamakan $GIT_SSH, dan diinterpretasikan oleh shell, yang memungkinkan argumen tambahan untuk disertakan.

Boris
sumber
Haruskah ada baris baru sebelumnya git cloneatau apakah kodenya benar?
Tomáš Zato - Kembalikan Monica
7
Ini seharusnya benar, tanpa baris baru variabel harus disetel untuk perintah berikut. Jika Anda menambahkan baris baru, Anda perlu mengekspor variabel, maka itu juga harus berfungsi.
Boris
Terima kasih, saya terjebak dalam hal ini selama 2 hari!
James Gentes
Booya! Terima kasih.
Jasper Blues
itu tidak akan berfungsi dengan git 1.9 versi Saya percaya, apakah ada solusi alternatif untuk git 1.9
lazarus
33

Opsi lain yang dibuat untuk menentukan kunci yang berbeda adalah git config core.sshCommanddengan git 2.10 + (Q3 2016).

Ini adalah sebuah alternatif untuk variabel lingkungan yang dijelaskan dalam Boris 's jawaban )

Lihat commit 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 GIT_SSH_COMMAND yang akan digunakan per repositori.

Mirip dengan $GIT_ASKPASSor $GIT_PROXY_COMMAND, kami juga membaca dari file konfigurasi terlebih dahulu lalu kembali ke $GIT_SSH_COMMAND.

Ini berguna untuk memilih kunci pribadi berbeda yang menargetkan host yang sama (mis. Github)

core.sshCommand:

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

Artinya git clonedapat menjadi:

cd /path/to/my/repo
git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' 
# later on
git clone host:repo.git

Jika Anda ingin menerapkannya untuk semua repo, seperti yang ditambahkan user1300959 di komentar , Anda akan menggunakan konfigurasi global.

git config --global core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
VonC
sumber
2
Kemungkinan besar Anda belum memiliki repo, karena Anda memilikinya git clone- dalam hal ini Anda mungkin ingin mengkonfigurasi perintah git ssh secara global:git config --global core.sshCommand ...
iurii
@ user1300959 Poin yang bagus, terima kasih. Saya telah memasukkan komentar Anda dalam jawaban untuk visibilitas lebih lanjut.
VonC
Ini jawaban terbaik.
MikeSchinkel
Di bagian terakhir Anda tidak memiliki apostrof
Luigi Lopez
@LuigiLopez Bisakah Anda mengedit jawabannya? Saya akan meninjau hasil edit Anda.
VonC
22

Berikut adalah contoh rumit cara meneruskan argumen ssh dengan menggunakan variabel GIT_SSH:

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

Catatan: Baris di atas adalah baris perintah terminal yang harus Anda tempelkan ke terminal Anda. Ini akan membuat file ssh , membuatnya dapat dieksekusi dan mengeksekusinya.

Jika Anda ingin memberikan opsi kunci privat, silakan periksa Bagaimana cara memberi tahu git kunci privat mana yang harus digunakan? .

kenorb
sumber
Bagus! Pertanyaan: Keduanya $*dan "$@"sepertinya berhasil. Biasanya saya gunakan "$@", karena yang lain sepertinya usang. Apakah ada alasan untuk memilih $*dalam kasus ini?
mh8020
16

Konfigurasi tingkat repositori tanpa memengaruhi pengaturan tingkat sistem

Menggabungkan jawaban yang sudah tersedia, saya memilih langkah-langkah di bawah ini. Ini memastikan bahwa perubahan konfigurasi tidak berdampak pada level mesin, tetapi hanya untuk repositori yang sedang dikerjakan. Ini diperlukan dalam kasus saya karena skrip saya harus dijalankan pada agen Bamboo bersama.

1. Klon repositori yang menggunakan GIT_SSH_COMMANDpendekatan.

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone ssh://url

2. Setelah di-clone, masuk ke direktori repositori.

cd repo-dir

3. Atur core.sshCommandkonfigurasi sehingga semua panggilan selanjutnya dapat dijalankan dengan perintah git seperti biasa, tetapi secara internal menggunakan opsi git yang disediakan.

git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
Pavan Kumar
sumber
1
Penggunaan yang bagus core.sshCommand, yang saya sebutkan di atas. Suara positif.
VonC
5

Saya pikir perbarui git ke versi> = 2.3 dan gunakan GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@hostadalah opsi taruhan, tetapi jika tidak memungkinkan, @ josh-lee memberikan opsi yang baik, tetapi tolong, perbarui jawaban Anda dengan memasukkan file konfigurasi ssh.

Host host
    HostName host
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
Jonathan Beber
sumber
0

Masalah ini telah diperbaiki dengan melakukan langkah-langkah ikuti di mesin Window: -

  • Buat file konfigurasi di bawah folder C: \ Users \ username.ssh.

  • tambahkan baris berikut ke file konfigurasi.

    host <HOST>
    hostname <HOSTNAME>
    user <USER_NAME>
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    port <PORT_NUMBER>
    KexAlgorithms +diffie-hellman-group1-sha1
    
  • lalu coba lagi.

Ajay Kumar
sumber