git - klucz hosta serwera nie jest buforowany

101

Próbuję wypchnąć zmiany z lokalnego repozytorium do zdalnego repozytorium. Kiedy piszę:

git push origin

Otrzymuję następujący błąd:

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

Jak mogę to rozwiązać? Używam git z wiersza poleceń w systemie Windows 7.

Edytować

Kiedy próbuję wykonać proste ssh

ssh user@hostname

Otrzymuję następujący błąd:

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

W jakiś sposób nie utworzy katalogu, ponieważ ścieżka jest nieprawidłowa. Jak to naprawić?

@eckes: Edit2

Mój dom jest ustawiony na, %HOMEDRIVE%%HOMEPATH%czy to prawda?

Rene Terstegen
źródło
2
Wygląda na $HOMEto, że nie jest poprawnie skonfigurowany. Spróbuj ustawić HOMEzmienną środowiskową w systemie Windows za pomocą My Computer-> kliknięcie prawym przyciskiem myszy -> Properties-> Tab Advanced-> PrzyciskEnvironment Variables
eckes
1
Nie jestem facetem od okien, ale wydaje mi się dziwne, że po /c//(prawdopodobnie liście dysku) nadal masz %HOMEDRIVE%... Możesz zaoszczędzić trochę czasu, bawiąc się wartością i powtarzając ją?
Cascabel
1
Rozwiń HOMEDRIVEi HOMEPATHustaw HOMEna wynikową wartość ...
eckes

Odpowiedzi:

54

Komunikat oznacza, że ​​w originpliku zaufanych hostów nie ma klucza hosta .

Aby obejść ten problem, otwórz zwykłe połączenie SSH do, origina SSH zapyta Cię, czy chcesz ufać zdalnemu hostowi (z konsoli 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)?

Jeśli ufasz zdalnemu hostowi (tj. Typowi yes), SSH doda swój klucz do listy znanych hostów.

Po tym powinieneś być w stanie zrobić swój git push origin.

Alternatywnie, możesz również ręcznie dodać klucz origindo, .ssh/known_hostsale wymaga to przestrzegania formatu known_hostspliku, jak opisano na stronie podręcznika podręcznika sshd(Sekcja AUTHORIZED_KEYS FORMAT PLIKU ).

eckes
źródło
4
Otrzymałem tę samą wiadomość, gdy wykonałem push na github, ale mogę ssh do github i mam github.com w moim known_hostspliku.
Magnus Lindhe
1
Spójrz na odpowiedź poniżej w tym przypadku
Nikita Koksharov
3
Możesz używać PuTTY w systemie Windows do tych samych celów, zamiast klienta SSH z wiersza poleceń.
brianmearns
1
Upewnij się, że nazwy hostów są dokładnie takie same. Na przykład, jeśli zainstalowałeś git lokalnie i używasz nazwy „home.moja_domena.com” jako pilota, ale przechowujesz klucz za pomocą putty do połączenia z „localhost”, to nie zadziała. Musisz połączyć się dokładnie z nazwą hosta w zdalnym adresie URL.
Jason Goemaat
U mnie naprawiono próbę połączenia z kitem do serwera. Powiedzmy, że git url to ssh: //[email protected]: 222 / coś / sklep.git, więc wpisałem do pola Nazwa hosta przykład.ex.com i port 222. Następnie połączenie nie powiodło się, ale myślę, że dodałem palec drukuj tam, gdzie to potrzebne. Po prostu nie rozumiem, gdzie został dodany, ponieważ w moim katalogu domowym known_hosts - plik nie został dotknięty, gdy
usunąłem
157

Dla tych z Was, którzy konfigurują MSYS Git w systemie Windows za pomocą PuTTY za pomocą standardowego wiersza poleceń, sposobem na dodanie hosta do pamięci podręcznej PuTTY jest uruchomienie

> plink.exe <host>

Na przykład:

> 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)

Po prostu odpowiedz y, a następnie Ctrl + C reszta.

Sprawdź jednak odcisk palca. To ostrzeżenie istnieje nie bez powodu. Odciski palców dla niektórych usług git (edytuj, aby dodać więcej):

Roman Starkov
źródło
15
To powinna być akceptowana odpowiedź. Dokładnie do tego odnosi się komunikat o błędzie. W moim przypadku, kiedy klonowałem, użyłem FQDN, ale na moim nowym komputerze logowałem się tylko przy użyciu krótkiej nazwy domeny lokalnej. Musiałem zalogować się przez putty lub plink jako FQDN, aby buforować klucz dla nazwy hosta w miejscu pochodzenia. Pomocne może być krzyżowe sprawdzenie nazwy hosta używanego jako zdalny przy użyciu polecenia „git remote -v”.
peabody
3
Działa również w celu użycia interaktywnego PuTTY do hosta, którego próbujesz użyć. Na przykład, jeśli próbujesz sklonować repozytorium Github po raz pierwszy na nowym komputerze z systemem Windows, użyj PuTTY, aby otworzyć sesję z hostem „github.com”, zaakceptuj monit dotyczący zaufania serwera, a następnie sklonuj w wiersz poleceń powinien działać.
Jeremy McGee
1
Możesz powiedzieć, że MSYS próbuje użyć git, plinkuruchamiając $ set | grep GIT_SSHi sprawdzającGIT_SSH='C:\Program Files (x86)\PuTTY\plink.exe'
shuckc.
2
W końcu rozwiązałem ten problem, dodając mój klucz do Pageant i uzyskując bezpośredni dostęp do hosta za pomocą Putty. To prosi o dodanie hosta do pamięci podręcznej. Robi to samo.
Knossos
1
Jeśli repozytorium git serwowane jest na niestandardowym porcie SSH, należy -Pwybrać port, takich jak: plink.exe example.com -P 2222. Udało mi się sklonować z github, ale nie z mojego osobistego serwera, co bez końca mnie zdezorientowało.
Hay
79

Spróbuj wykonać polecenie „set | grep -i ssh” z zachęty Git Bash

Jeśli twoja konfiguracja jest taka jak moja, prawdopodobnie masz te zestawy:

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

zrobiłem

unset GIT_SSH
unset PLINK_PROTOCOL
unset GIT_SVN

i po tym zadziałało, .. myślę, że putty zapisuje swoje klucze gdzie indziej jako $ HOME / .ssh czy coś takiego ... (miałem też problem z pudełkiem, w którym $ HOME było ustawione na "C: \ Users \ usrnam "zamiast" / C / Users / usrnam / "

w każdym razie Twój przebieg może się różnić, ale to rozwiązało problem. :-)

(chyba wystarczy zrobić nieustawiony GIT_SSH, ale byłem na fali)

Uwaga: jeśli brak ustawienia nie działa dla Ciebie, spróbuj tego:

set GIT_SSH=
Thijs
źródło
1
„unset GIT_SSH” działało dla mnie. Skonfigurowałem Pageant / putty wcześniej dla innego serwera, ale kiedy zbudowałem nowe klucze za pomocą zachęty Git Bash, musiałem wrócić. Dzięki za pomoc.
supermitch
po zrobieniu twoich kroków poszedłem dalej, ale teraz pojawia się błąd „zepsuty Mac przy wejściu”… Czy kiedykolwiek go widziałem?
CD Smith
2
Podczas instalacji gita możesz NIE ustawiać tych zmiennych. Jest to nawet wariant domyślny. Chociaż wybrałem też integrację plink, dlatego tu jestem) Dzięki.
Antony Hatchkins,
1
To działało również dla mnie na Win7. Najwyraźniej konfiguracja git basha z plink była przyczyną problemu w moim przypadku.
nhylowane
2
unset GIT_SSHdla mnie też zadziałało, chociaż muszę to robić za każdym razem, gdy uruchamiam git bash, co jest dość nudne. Masz pomysł, jak to zautomatyzować?
Loïc
19

Podejrzewam, że twoja GIT_SSHzmienna środowiskowa jest ustawiona na %ProgramFiles(x86)%\putty\plink.exe. Z jakiegoś powodu PLink nie używa .ssh/known_hostspliku w katalogu użytkownika do przechowywania kluczy hostów zdalnych.

Jeśli tak jest w rzeczywistości, a może to być celowe, jeśli chcesz korzystać z konkursu, musisz najpierw użyć PLink, aby połączyć się z hostem.

"$GIT_SSH" user@hostname

Powinieneś dostać podobną wiadomość

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)

Po udzieleniu odpowiedzi yna pytanie i pomyślnym połączeniu ze zdalnym hostem wszystko powinno być gotowe. Śmiało i spróbuj ponownie.

Gunee
źródło
To było to dla mnie, używając Git Bash w Windows z PLink / Pageant. Dzięki wielkie!
amsross
1
Korzystając z repozytorium Stash (obecnie Bitbucket), musiałem użyć"$GIT_SSH" -P 7999 [email protected]
Julien
4

Samo połączenie się z hostem nie wystarczy, przynajmniej w systemie Windows. To dodaje klucz hosta, ssh/known_hostsale błąd nadal występuje.

Musisz zamknąć okno git bash i otworzyć nowe. Następnie pamięć podręczna rejestru jest czyszczona i funkcja push / pull działa.

andynormancx
źródło
ssh/known_hostsjest relatywny do czego ?,% USERPROFILE% Mam ten problem w Win 7 i nie ma rozwiązania ...
Frank Nocke Kwietnia
2

Rene, twoja HOMEzmienna nie jest ustawiona poprawnie. Albo zmień to nac:\Users\(your-username) lub po prostu na %USERNAME%.

rezsa f
źródło
2

Rozwiązanie z Plink

Zapisz ten skrypt Pythona w 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

Testowane na Win7x64 i Pythonie 2.7 .

Następnie uruchomić:

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

I wybierz import do rejestru. Keyscan pobierze klucz publiczny dla domeny (miałem problemy z bitbucketem), a następnie skrypt Pythona przekonwertuje go do formatu Plink.

Henrik
źródło
2

Miałem ten sam problem i zapomniałem połączyć się z SSH na porcie, na którym znajduje się rzeczywiste repozytorium , a nie tylko ogólny port SSH, wtedy klucz hosta jest inny!

Mateusz
źródło
Użyj również tego samego sposobu określania hosta, np. Nie gitserver.example.com dla ssh i gitserver dla git.
Matthijs P
2

Po prostu otwórz Putty i spróbuj nawiązać połączenie ze zdalnym serwerem, z którego chcesz przesłać swój kod. kiedy pojawi się okno dialogowe, naciśnij Tak (ufasz pilotowi), a wszystko będzie w porządku.

sadegh saati
źródło
2

Środowisko pracy:

  • Windows 10
  • git
  • kit

Po pierwsze: Usuń putty known_hosts w rejestrze zgodnie z Regedit.
Następnie: Wykonanie polecenia %GIT_SSH% user@hostnamew cmd systemu Windows rozwiązuje problem.

Mam nadzieję, że to pomoże wam wszystkim.

Jason 徐
źródło
1

Ja również miałem ten sam problem, gdy próbowałem sklonować repozytorium na moim komputerze z systemem Windows 7. Wypróbowałem większość wymienionych tutaj odpowiedzi. Żaden z nich nie pracował dla mnie.

U mnie zadziałało uruchomienie programu Pageant (agent uwierzytelniający Putty). Gdy Pageant działał w tle, mogłem klonować, przesyłać i ściągać z / do repozytorium. To zadziałało dla mnie, być może dlatego, że skonfigurowałem mój klucz publiczny w taki sposób, że za każdym razem, gdy jest używany po raz pierwszy, wymagane jest hasło i uruchamia się Pageant.

sunilkumarba
źródło
Otrzymujesz inny komunikat o błędzie, gdy jest to problem z konkursem. Nie Connection abandoned, ale coś w rodzajuAccess denied (private key)
Andrey Regentov
1

Zmiana z PuTTY na OpenSSH rozwiązała ten problem bez konieczności wyłączania GIT_SSH itp.

79E09796
źródło
Jeśli otrzymasz komunikat o nierozpoznanym kluczu hosta podczas wykonywania operacji git push / pull przy użyciu ATLASSIAN SOURCETREE, nie masz możliwości odpowiedzi t / n, a operacja push / pull zostanie przerwana bez buforowania klucza. Jednak przejście do SourceTree Tools-> Options (zakładka General) i zmiana klienta SSH w (w sekcji SSH Client Configuration) z PuTTY na OpenSSH pozwoli na buforowanie klucza bez zmiany czegokolwiek innego.
Rod Dewell
1

Rozwiązałem podobny problem, korzystając z tego obejścia .

Wystarczy przełączyć się na Embedded Git, nacisnąć, nacisnąć przycisk Yes, a następnie przełączyć się z powrotem na System Git.

Możesz znaleźć tę opcję w

Tools -> Options -> Git
Pyro2266
źródło
1
Teraz w lokalizacji v2.5.5.0:C:\Users\{UserName}\AppData\Local\SourceTree\app-2.5.5\tools\putty> .\plink.exe {YourNewHost}
John_J,
1

Jak odpowiedział Roman Starkov , plinkmusi dodać hosta do swojej pamięci podręcznej.

Dla osób korzystających z rozszerzeń Git :

  1. Otwórz rozszerzenia Git
  2. Przejdź do Narzędzia -> Ustawienia -> SSH
  3. Skopiuj ścieżkę do „plink.exe” (jeśli używasz PuTTY) / „klink.exe” (jeśli używasz KiTTY)
  4. W konsoli uruchom następujące polecenie:

(zastąp rzeczywistymi ścieżkami)

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

na przykład

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

Uwaga : upewnij się, że używasz tego samego plink / klink, którego używają rozszerzenia Git!

Reyhn
źródło
0

Dodanie hosta bezpośrednio za pomocą Bash nie rozwiązało problemu, błąd nadal występował podczas używania funkcji „Pobierz wszystko” w rozszerzeniach Git. Używając opcji „Pull” w jednej gałęzi, wymagany host został dodany automatycznie przez rozszerzenia Git z wyskakującym ekranem Bash. Po wykonaniu tej czynności mogłem ponownie użyć funkcji „Pobierz wszystko”. Nie jestem pewien, co inaczej robią rozszerzenia Git.

Bart VdA
źródło
0

Wypróbowałem wszystkie powyższe metody, ale żadna z nich nie mogła naprawić tego samego problemu na moim laptopie. W końcu zamiast wypychać gałąź do początku w git bash, skracam, aby użyć opcji wypychania TortoiseGit, aby wykonać wypychanie, a następnie wyskakuje okno z prośbą o dodanie nowego klucza hosta do pamięci podręcznej, po kliknięciu przycisku tak wszystko idzie teraz dobrze.

Mam nadzieję, że to wam wszystkim pomoże.

Allen Jin
źródło
0

Zmieniłem dysk twardy, zainstalowałem Windows. Podczas próby przesłania plików otrzymałem to okno poleceń.

Nacisnąłem "y", potem Ctrl + C. Otworzyłem putty.exe, dodałem stary klawisz, wróciłem do gita i wrzuciłem pliki.

CoolMind
źródło
0

Po prostu odinstaluj rozszerzenia Git i zainstaluj ponownie, wybierając OpenSSH zamiast

Kiran.vanam
źródło
0

W systemie Windows 7 lub 10 sztuczka, która zadziałała, polega na usunięciu zmiennej systemowej GIT_SSH. Wcześniej był ustawiony do używania Plink, a teraz został zastąpiony przez Putty. To było przyczyną błędu Plink.exe

Była też stara instalacja Gita (wersja 32-bitowa) i aktualizacja do Git (np. Git-2.20.1-64-bit.exe), ponieważ na PC był 64-bitowy system operacyjny.

W każdym razie Putty / Plink nie był nawet używany przez Git, ponieważ w instalacji Git domyślnie używano Open SSH.

DonAriston
źródło
0

Jeśli otrzymasz komunikat o nierozpoznanym kluczu hosta podczas wykonywania operacji git push / pull przy użyciu ATLASSIAN SOURCETREE, nie masz możliwości odpowiedzi t / n, a operacja push / pull zostanie przerwana bez buforowania klucza. Jednak przejście do SourceTree Tools-> Options (zakładka General) i zmiana klienta SSH w (w sekcji SSH Client Configuration) z PuTTY na OpenSSH pozwoli na buforowanie klucza bez zmiany czegokolwiek innego.

Rod Dewell
źródło