git - Kunci host server tidak disimpan dalam cache

101

Saya mencoba untuk mendorong perubahan dari repo lokal saya ke repo jarak jauh. Saat saya mengetik:

git push origin

Saya mendapatkan kesalahan berikut:

The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's rsa2 key fingerprint is:
ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
Connection abandoned.
fatal: The remote end hung up unexpectedly

Bagaimana saya bisa memecahkan masalah ini? Saya menggunakan git dari baris perintah di Windows 7.

Edit

Ketika saya mencoba melakukan ssh sederhana

ssh user@hostname

Saya mendapatkan kesalahan berikut:

Could not create directory '/c//%HOMEDRIVE%%HOMEPATH%/.ssh'.
percent_expand: unknown key %H

Entah bagaimana itu tidak akan membuat direktori, karena jalurnya tidak valid. Bagaimana cara mengatasinya?

@eckes: Edit2

Rumah saya disetel ke %HOMEDRIVE%%HOMEPATH%apakah ini benar?

Rene Terstegen
sumber
2
Sepertinya $HOMEtidak diatur dengan benar. Cobalah untuk mengatur HOMEvariabel lingkungan pada windows menggunakan My Computer-> klik kanan -> Properties-> Tab Advanced-> TombolEnvironment Variables
eckes
1
Saya bukan orang jendela, tapi menurut saya aneh bahwa setelah /c//(mungkin huruf drive) Anda masih memiliki %HOMEDRIVE%... Anda mungkin bisa menghemat waktu dengan mengutak-atik nilainya sendiri, dan mengulanginya?
Cascabel
1
Perluas HOMEDRIVEdan HOMEPATHsetel HOMEke nilai yang dihasilkan ...
eckes

Jawaban:

54

Pesan tersebut berarti bahwa kunci host origintidak ada di file host tepercaya Anda.

Untuk menyiasati ini, buka koneksi SSH biasa ke origindan SSH akan menanyakan apakah Anda ingin mempercayai host jarak jauh (dari konsol Git):

$ ssh 127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
RSA key fingerprint is <FINGERPRINT>.
Are you sure you want to continue connecting (yes/no)?

Jika Anda mempercayai host jarak jauh (yaitu tipe yes), SSH akan menambahkan kuncinya ke daftar host yang dikenal.

Setelah itu, Anda harus bisa melakukan git push origin.

Sebagai alternatif, Anda juga dapat menambahkan kunci originke secara manual .ssh/known_hoststetapi ini mengharuskan Anda untuk mematuhi format known_hostsfile seperti yang dijelaskan di halaman manual sshd(Bagian FORMAT FILE AUTHORIZED_KEYS ).

eckes
sumber
4
Saya mendapat pesan yang sama ketika melakukan push ke github tetapi saya dapat ssh ke github dan saya memiliki github.com di known_hostsfile saya .
Magnus Lindhe
1
Lihat jawaban di bawah dalam kasus ini
Nikita Koksharov
3
Anda dapat menggunakan PuTTY di windows untuk tujuan yang sama, sebagai ganti klien SSH baris perintah.
Brianmearns
1
Pastikan nama host sama persis. Misalnya jika Anda menginstal git secara lokal dan menggunakan nama 'home.mydomain.com' sebagai remote Anda, tetapi simpan kunci menggunakan dempul untuk terhubung ke 'localhost', itu tidak akan berhasil. Anda harus terhubung ke nama host persis di url jarak jauh Anda.
Jason Goemaat
Bagi saya tetap mencoba terhubung dengan dempul ke server. Katakanlah git url adalah ssh: //[email protected]: 222 / sesuatu / shop.git jadi saya memasukkan putty Host name field example.ex.com dan port 222. Kemudian koneksi gagal tetapi saya rasa itu menambahkan jari mencetak di tempat yang diperlukan. Saya hanya tidak mengerti di mana itu ditambahkan karena di direktori home saya known_hosts - file tidak terpengaruh ketika saya menghapus kunci lama
Darius.V
157

Bagi anda yang sedang melakukan setting MSYS Git di Windows menggunakan PuTTY melalui command prompt standar, cara menambahkan host ke cache PuTTY adalah dengan menjalankan

> plink.exe <host>

Sebagai contoh:

> plink.exe codebasehq.com

The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's rsa2 key fingerprint is:
ssh-rsa 2048 2e:db:b6:22:f7:bd:48:f6:da:72:bf:59:d7:75:d7:4e
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n)

Jawab saja y, lalu Ctrl + C sisanya.

Periksa sidik jarinya. Peringatan ini ada untuk alasan yang bagus. Sidik jari untuk beberapa layanan git (harap edit untuk menambahkan lebih banyak):

Roman Starkov
sumber
15
Ini harus menjadi jawaban yang diterima. Tepatnya merujuk pada pesan kesalahan tersebut. Dalam kasus saya ketika saya mengkloning, saya telah menggunakan FQDN, tetapi di komputer baru saya, saya hanya masuk menggunakan nama domain lokal singkat. Saya harus masuk melalui dempul atau plink sebagai FQDN untuk menyimpan kunci nama host di asalnya. Ini dapat membantu untuk memeriksa ulang nama host yang digunakan sebagai remote menggunakan "git remote -v".
peabody
3
Ini juga berfungsi untuk menggunakan Putty interaktif ke host yang Anda coba gunakan. Misalnya, jika Anda mencoba untuk mengkloning repositori Github untuk pertama kalinya pada mesin Windows baru, gunakan PuTTY untuk membuka sesi ke host 'github.com', terima permintaan terkait kepercayaan server, lalu klon di baris perintah harus bekerja.
Jeremy McGee
1
Anda dapat mengetahui MSYS git sedang berusaha untuk digunakan plinkdengan menjalankan $ set | grep GIT_SSHdan memeriksaGIT_SSH='C:\Program Files (x86)\PuTTY\plink.exe'
shuckc
2
Saya akhirnya menyelesaikan ini dengan menambahkan kunci saya ke Pageant, dan mengakses host dengan Putty secara langsung. Ini meminta Anda untuk menambahkan host ke cache. Melakukan hal yang sama.
Knossos
1
Jika repositori git Anda disajikan pada port SSH kustom, gunakan -Puntuk memilih port, seperti: plink.exe example.com -P 2222. Saya dapat mengkloning dari github tetapi tidak dari server pribadi saya, dan ini membuat saya bingung sampai akhir.
Hay
79

Coba lakukan "set | grep -i ssh" dari prompt Git Bash

Jika pengaturan Anda seperti milik saya, Anda mungkin memiliki set ini:

GIT_SSH='C:\Program Files (x86)\PuTTY\plink.exe'
PLINK_PROTOCOL=ssh
SVN_SSH='"C:\\Program Files (x86)\\PuTTY\\plink.exe"'

Saya melakukan

unset GIT_SSH
unset PLINK_PROTOCOL
unset GIT_SVN

dan berhasil setelah itu, .. Saya kira dempul menyimpan kuncinya di tempat lain sebagai $ HOME / .ssh atau sesuatu ... (Saya juga punya masalah pada kotak di mana $ HOME disetel ke "C: \ Users \ usrnam "bukan" / C / Users / usrnam / "

bagaimanapun, jarak tempuh Anda mungkin berbeda, tetapi itu tetap untuk saya. :-)

(mungkin hanya melakukan GIT_SSH yang tidak disetel sudah cukup, tetapi saya berhasil)

Catatan: jika tidak disetel tidak berhasil untuk Anda, coba ini:

set GIT_SSH=
Thijs
sumber
1
"unset GIT_SSH" berhasil untuk saya. Saya telah menyiapkan Pageant / putty sebelumnya untuk server yang berbeda, tetapi ketika saya membuat kunci baru menggunakan prompt Git Bash, saya harus kembali. Terima kasih untuk bantuannya.
supermitch
setelah mengambil langkah Anda, saya melangkah lebih jauh tetapi sekarang saya mendapatkan kesalahan "mac saat input" ... pernah melihat yang satu itu?
CD Smith
2
Saat memasang git, Anda dapat memilih untuk TIDAK menyetel variabel tersebut. Itu bahkan merupakan varian default. Meskipun saya memilih integrasi plink juga, itulah mengapa saya di sini) Terima kasih.
Antony Hatchkins
1
Ini bekerja untuk saya juga di Win7. Rupanya pengaturan git bash dengan plink menyebabkan masalah dalam kasus saya.
dihilangkan
2
unset GIT_SSHbekerja untuk saya juga, meskipun saya harus melakukannya setiap kali saya meluncurkan git bash yang cukup membosankan. Ada ide tentang cara mengotomatiskan itu?
Loïc
19

Saya menduga bahwa GIT_SSHvariabel lingkungan Anda disetel ke %ProgramFiles(x86)%\putty\plink.exe. Untuk beberapa alasan, PLink tidak menggunakan .ssh/known_hostsfile di direktori pengguna Anda untuk menyimpan kunci host jarak jauh.

Jika ini benar-benar kasus Anda, dan mungkin memang sengaja jika Anda ingin menggunakan kontes, Anda perlu menggunakan PLink untuk terhubung ke host terlebih dahulu.

"$GIT_SSH" user@hostname

Anda harus mendapatkan pesan serupa

The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's rsa2 key fingerprint is:
ssh-rsa 2048 86:7b:1b:12:85:35:8a:b7:98:b6:d2:97:5e:96:58:1d
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n)

Setelah Anda menjawab ypertanyaan dan berhasil terhubung ke host jarak jauh, Anda harus siap. Silakan dan coba dorong Anda lagi.

Gunee
sumber
Ini untuk saya menggunakan Git Bash di windows dengan PLink / Pageant. Terima kasih banyak!
amsross
1
Menggunakan repositori Stash (sekarang Bitbucket), saya harus menggunakan"$GIT_SSH" -P 7999 [email protected]
Julien
4

Hanya ssh'ing ke host saja tidak cukup, setidaknya di Windows. Itu menambahkan kunci host ke ssh/known_hoststetapi kesalahan masih berlanjut.

Anda perlu menutup jendela git bash dan membuka yang baru. Kemudian cache registri dihapus dan push / pull kemudian berfungsi.

andynormancx
sumber
ssh/known_hostsrelatif dengan apa ?,% USERPROFILE% Saya mengalami masalah ini di Win 7, dan tidak ada solusi ...
Frank Nocke
2

Rene, HOMEvariabel Anda tidak disetel dengan benar. Ubah menjadi c:\Users\(your-username)atau hanya menjadi %USERNAME%.

rezsa f
sumber
2

Solusi dengan Plink

Simpan skrip python ini ke known_hosts.py:

#! /usr/bin/env python

# $Id$
# Convert OpenSSH known_hosts and known_hosts2 files to "new format" PuTTY
# host keys.
#   usage:
#     kh2reg.py [ --win ] known_hosts1 2 3 4 ... > hosts.reg
#       Creates a Windows .REG file (double-click to install).
#     kh2reg.py --unix    known_hosts1 2 3 4 ... > sshhostkeys
#       Creates data suitable for storing in ~/.putty/sshhostkeys (Unix).
# Line endings are someone else's problem as is traditional.
# Developed for Python 1.5.2.

import fileinput
import base64
import struct
import string
import re
import sys
import getopt

def winmungestr(s):
    "Duplicate of PuTTY's mungestr() in winstore.c:1.10 for Registry keys"
    candot = 0
    r = ""
    for c in s:
        if c in ' \*?%~' or ord(c)<ord(' ') or (c == '.' and not candot):
            r = r + ("%%%02X" % ord(c))
        else:
            r = r + c
        candot = 1
    return r

def strtolong(s):
    "Convert arbitrary-length big-endian binary data to a Python long"
    bytes = struct.unpack(">%luB" % len(s), s)
    return reduce ((lambda a, b: (long(a) << 8) + long(b)), bytes)

def longtohex(n):
    """Convert long int to lower-case hex.

    Ick, Python (at least in 1.5.2) doesn't appear to have a way to
    turn a long int into an unadorned hex string -- % gets upset if the
    number is too big, and raw hex() uses uppercase (sometimes), and
    adds unwanted "0x...L" around it."""

    plain=string.lower(re.match(r"0x([0-9A-Fa-f]*)l?$", hex(n), re.I).group(1))
    return "0x" + plain

output_type = 'windows'

try:
    optlist, args = getopt.getopt(sys.argv[1:], '', [ 'win', 'unix' ])
    if filter(lambda x: x[0] == '--unix', optlist):
        output_type = 'unix'
except getopt.error, e:
    sys.stderr.write(str(e) + "\n")
    sys.exit(1)

if output_type == 'windows':
    # Output REG file header.
    sys.stdout.write("""REGEDIT4

[HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys]
""")

# Now process all known_hosts input.
for line in fileinput.input(args):

    try:
        # Remove leading/trailing whitespace (should zap CR and LF)
        line = string.strip (line)

        # Skip blanks and comments
        if line == '' or line[0] == '#':
            raise "Skipping input line"

        # Split line on spaces.
        fields = string.split (line, ' ')

        # Common fields
        hostpat = fields[0]
        magicnumbers = []   # placeholder
        keytype = ""        # placeholder

        # Grotty heuristic to distinguish known_hosts from known_hosts2:
        # is second field entirely decimal digits?
        if re.match (r"\d*$", fields[1]):

            # Treat as SSH-1-type host key.
            # Format: hostpat bits10 exp10 mod10 comment...
            # (PuTTY doesn't store the number of bits.)
            magicnumbers = map (long, fields[2:4])
            keytype = "rsa"

        else:

            # Treat as SSH-2-type host key.
            # Format: hostpat keytype keyblob64 comment...
            sshkeytype, blob = fields[1], base64.decodestring (fields[2])

            # 'blob' consists of a number of
            #   uint32    N (big-endian)
            #   uint8[N]  field_data
            subfields = []
            while blob:
                sizefmt = ">L"
                (size,) = struct.unpack (sizefmt, blob[0:4])
                size = int(size)   # req'd for slicage
                (data,) = struct.unpack (">%lus" % size, blob[4:size+4])
                subfields.append(data)
                blob = blob [struct.calcsize(sizefmt) + size : ]

            # The first field is keytype again, and the rest we can treat as
            # an opaque list of bignums (same numbers and order as stored
            # by PuTTY). (currently embedded keytype is ignored entirely)
            magicnumbers = map (strtolong, subfields[1:])

            # Translate key type into something PuTTY can use.
            if   sshkeytype == "ssh-rsa":   keytype = "rsa2"
            elif sshkeytype == "ssh-dss":   keytype = "dss"
            else:
                raise "Unknown SSH key type", sshkeytype

        # Now print out one line per host pattern, discarding wildcards.
        for host in string.split (hostpat, ','):
            if re.search (r"[*?!]", host):
                sys.stderr.write("Skipping wildcard host pattern '%s'\n"
                                 % host)
                continue
            elif re.match (r"\|", host):
                sys.stderr.write("Skipping hashed hostname '%s'\n" % host)
                continue
            else:
                m = re.match (r"\[([^]]*)\]:(\d*)$", host)
                if m:
                    (host, port) = m.group(1,2)
                    port = int(port)
                else:
                    port = 22
                # Slightly bizarre output key format: 'type@port:hostname'
                # XXX: does PuTTY do anything useful with literal IP[v4]s?
                key = keytype + ("@%d:%s" % (port, host))
                value = string.join (map (longtohex, magicnumbers), ',')
                if output_type == 'unix':
                    # Unix format.
                    sys.stdout.write('%s %s\n' % (key, value))
                else:
                    # Windows format.
                    # XXX: worry about double quotes?
                    sys.stdout.write("\"%s\"=\"%s\"\n"
                                     % (winmungestr(key), value))

    except "Unknown SSH key type", k:
        sys.stderr.write("Unknown SSH key type '%s', skipping\n" % k)
    except "Skipping input line":
        pass

Diuji pada Win7x64 dan Python 2.7 .

Lalu lari:

ssh-keyscan -t rsa bitbucket.org >>~/.ssh/known_hosts
python --win known_hosts.py >known_hosts.reg
start known_hosts.reg

Dan pilih untuk mengimpor ke registri. Keycan akan mengambil kunci publik untuk domain (saya memiliki masalah dengan bitbucket), dan kemudian skrip python akan mengubahnya menjadi format Plink.

Henrik
sumber
2

Punya masalah yang sama, dan lupa untuk terhubung ke SSH di port di mana sebenarnya repositori , bukan hanya port SSH umum, maka kunci host berbeda!

Mateusz
sumber
Gunakan juga cara yang sama persis untuk menentukan host, misalnya bukan gitserver.example.com untuk ssh dan gitserver untuk git.
Matthijs P
2

Buka saja Putty dan coba buat koneksi ke server jarak jauh yang ingin Anda masukkan kode Anda. ketika dialog muncul tekan Yes (you trust remote) maka semuanya akan beres.

sadegh saati
sumber
2

Lingkungan kerja:

  • Windows 10
  • git
  • dempul

Pertama: Hapus dempul known_hosts di register menurut Regedit.
Kemudian: Menjalankan perintah %GIT_SSH% user@hostnamedi cmd Window menyelesaikan masalah.

Semoga bisa membantu Anda semua.

Jason 徐
sumber
1

Saya juga mengalami masalah yang sama ketika mencoba mengkloning repositori di mesin Windows 7 saya. Saya mencoba sebagian besar jawaban yang disebutkan di sini. Tak satu pun dari mereka berhasil untuk saya.

Apa yang berhasil untuk saya adalah, menjalankan program Pageant (Agen otentikasi Putty). Setelah Pageant berjalan di latar belakang, saya dapat mengkloning, mendorong & menarik dari / ke repositori. Ini berhasil untuk saya, mungkin karena saya telah mengatur kunci publik saya sedemikian rupa sehingga setiap kali kunci itu digunakan untuk pertama kali diperlukan kata sandi & Kontes dimulai.

sunilkumarba
sumber
Anda menerima pesan kesalahan lain ketika itu masalah kontes kecantikan. Tidak Connection abandoned, tapi sesuatu sepertiAccess denied (private key)
Andrey Regentov
1

Mengubah dari PuTTY ke OpenSSH memperbaiki masalah ini untuk saya, tanpa perlu membatalkan pengaturan GIT_SSH, dll.

79E09796
sumber
Jika Anda menerima pesan tentang kunci host yang tidak dikenal saat melakukan operasi git push / pull menggunakan ATLASSIAN SOURCETREE, Anda tidak memiliki kemampuan untuk menjawab y / n dan operasi dorong / tarik akan dibatalkan tanpa menyimpan kunci tersebut. Namun pergi ke SourceTree Tools-> Options (Tab Umum) dan mengubah Klien SSH di bawah (di bawah Konfigurasi Klien SSH) dari PuTTY ke OpenSSH akan memungkinkan kunci untuk di-cache tanpa mengubah apa pun.
Rod Dewell
1

Saya memecahkan masalah serupa menggunakan solusi ini .

Anda hanya perlu beralih ke Embedded Git, tekan, tekan tombol Yes dan kemudian beralih kembali ke System Git.

Anda dapat menemukan opsi ini di

Tools -> Options -> Git
Pyro2266
sumber
1
Sekarang di lokasi v2.5.5.0:C:\Users\{UserName}\AppData\Local\SourceTree\app-2.5.5\tools\putty> .\plink.exe {YourNewHost}
John_J
1

Seperti yang dijawab oleh Roman Starkov , plinkperlu menambahkan host ke cache itu.

Untuk orang yang menggunakan Ekstensi Git :

  1. Buka Ekstensi Git
  2. Buka Alat -> Pengaturan -> SSH
  3. Salin path ke "plink.exe" (jika menggunakan PuTTY) / "klink.exe" (jika menggunakan KiTTY)
  4. Di konsol, jalankan perintah berikut:

(ganti dengan jalur sebenarnya)

<the path to plink/klink.exe> <address to the server>

misalnya

%ProgramData%\chocolatey\lib\kitty\tools\klink.exe codebasehq.com

Catatan : Pastikan untuk menggunakan plink / klink yang sama dengan yang digunakan Git Extensions!

Reyhn
sumber
0

Menambahkan host secara langsung dengan Bash tidak menyelesaikan masalah, kesalahan masih terjadi saat menggunakan 'Ambil semua' di Ekstensi Git. Dengan menggunakan 'Tarik' pada satu cabang, host yang diperlukan ditambahkan secara otomatis oleh Ekstensi Git dengan layar pop-up Bash. Setelah melakukan ini, saya dapat menggunakan 'Ambil Semua' lagi. Tidak yakin apa yang dilakukan oleh Git Extensions secara berbeda.

Bart VdA
sumber
0

Saya telah mencoba semua metode di atas tetapi tidak satupun dari mereka dapat memperbaiki masalah yang sama di laptop saya. Akhirnya alih-alih mendorong cabang ke asal di git bash, saya beralih untuk menggunakan opsi dorong TortoiseGit untuk melakukan dorongan, kemudian sebuah jendela muncul untuk meminta saya menambahkan kunci host baru ke cache, setelah mengklik tombol ya, semuanya berjalan baik-baik saja sekarang.

Semoga bisa membantu Anda semua.

Allen Jin
sumber
0

Saya mengubah hard disk, menginstal Windows. Ketika mencoba untuk mengunggah file menerima jendela perintah ini.

Saya menekan "y", lalu Ctrl + C. Dibuka putty.exe, menambahkan kunci lama dan kembali ke git dan mendorong file.

CoolMind
sumber
0

Cukup hapus instalan Ekstensi Git dan Instal lagi dengan memilih OpenSSH daripada

Kiran.vanam
sumber
0

Di Windows 7 atau 10, trik yang berhasil untuk saya adalah menghapus variabel sistem GIT_SSH. Itu diatur sebelumnya untuk menggunakan Plink, dan sekarang digantikan oleh Putty. Ini menyebabkan kesalahan Plink.exe

Ada juga instalasi lama Git (versi 32-bit) dan memperbarui ke Git (mis. Git-2.20.1-64-bit.exe) karena PC menggunakan OS 64-bit.

Pokoknya Putty / Plink bahkan tidak digunakan oleh Git karena dalam instalasi Git, secara default menggunakan Open SSH.

DonAriston
sumber
0

Jika Anda menerima pesan tentang kunci host yang tidak dikenal saat melakukan operasi git push / pull menggunakan ATLASSIAN SOURCETREE, Anda tidak memiliki kemampuan untuk menjawab y / n dan operasi dorong / tarik akan dibatalkan tanpa menyimpan kunci tersebut. Namun pergi ke SourceTree Tools-> Options (Tab Umum) dan mengubah Klien SSH di bawah (di bawah Konfigurasi Klien SSH) dari PuTTY ke OpenSSH akan memungkinkan kunci untuk di-cache tanpa mengubah apa pun.

Rod Dewell
sumber