git - Chiave host del server non memorizzata nella cache


101

Provo a inviare le modifiche dal mio repository locale a un repository remoto. Quando digito:

git push origin

Ottengo il seguente errore:

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

Come posso risolvere questo? Sto usando git dalla riga di comando in Windows 7.

modificare

Quando provo a fare un semplice ssh

ssh user@hostname

Ottengo il seguente errore:

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

In qualche modo non creerà la directory, perché il percorso non è valido. Come risolvere questo problema?

@eckes: Edit2

La mia casa è impostata su %HOMEDRIVE%%HOMEPATH%è corretto?


2
Sembra che $HOMEnon sia impostato correttamente. Prova a impostare la HOMEvariabile di ambiente su Windows usando My Computer-> clic destro -> Properties-> Tab Advanced-> PulsanteEnvironment Variables
eckes

1
Non sono un tipo Windows, ma mi sembra strano che dopo /c//(presumibilmente una lettera di unità) tu abbia ancora %HOMEDRIVE%... Potresti essere in grado di risparmiare un po 'di tempo giocherellando con il valore tu stesso e facendogli eco?
Cascabel

1
Espandi HOMEDRIVEe HOMEPATHe imposta HOMEil valore risultante ...
eckes

Risposte:


54

Il messaggio significa che la chiave host di originnon è presente nel file host attendibili.

Per aggirare questo problema, apri una semplice connessione SSH a origine SSH ti chiederà se vuoi fidarti dell'host remoto (dalla console 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)?

Se ti fidi dell'host remoto (cioè del tipo yes), SSH aggiungerà la sua chiave all'elenco degli host conosciuti.

Dopodiché, dovresti essere in grado di fare il tuo git push origin.

In alternativa, potresti anche aggiungere manualmente la chiave di origina .ssh/known_hostsma questo richiede che tu aderisca al formato del known_hostsfile come descritto nella pagina man di sshd(Sezione AUTHORIZED_KEYS FILE FORMAT ).


4
Ho ricevuto lo stesso messaggio quando eseguo un push su github ma posso eseguire ssh su github e ho github.com nel mio known_hostsfile.
Magnus Lindhe

1
Guarda la risposta qui sotto in questo caso
Nikita Koksharov

3
Puoi usare PuTTY su Windows per gli stessi scopi, al posto di un client SSH da riga di comando.
brianmearns

1
Assicurati che i nomi host siano esattamente gli stessi. Ad esempio, se hai git installato localmente e usi il nome "home.mydomain.com" come telecomando, ma memorizzi la chiave usando putty per connetterti a "localhost", non funzionerà. Devi connetterti esattamente al nome host nel tuo URL remoto.
Jason Goemaat

Per me è stato risolto il tentativo di connettersi con putty al server. Diciamo che git url è ssh: //git@example.ex.com: 222 / something / shop.git quindi sono entrato nel campo del nome host putty example.ex.com e nella porta 222. Quindi la connessione non è riuscita ma immagino abbia aggiunto il dito stampare dove serve. Solo non capisco dove sia stato aggiunto perché nella mia home directory known_hosts - il file non è stato interessato quando ho cancellato la vecchia chiave
Darius.V

157

Per quelli di voi che stanno configurando MSYS Git su Windows utilizzando PuTTY tramite il prompt dei comandi standard, il modo per aggiungere un host alla cache di PuTTY è eseguire

> plink.exe <host>

Per esempio:

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

Rispondi ye poi Ctrl + C il resto.

Però controlla l'impronta digitale. Questo avviso esiste per una buona ragione. Impronte digitali per alcuni servizi git (modifica per aggiungerne altri):


15
Questa dovrebbe essere la risposta accettata. È esattamente ciò a cui si riferisce il messaggio di errore. Nel mio caso, quando ho clonato, avevo utilizzato un FQDN, ma sulla mia nuova macchina avevo effettuato l'accesso solo utilizzando il nome di dominio locale breve. Ho dovuto accedere tramite putty o plink come FQDN per memorizzare nella cache la chiave per il nome host sull'origine. Può essere utile effettuare un controllo incrociato del nome host utilizzato come telecomando utilizzando "git remote -v".
peabody

3
Funziona anche per utilizzare PuTTY interattivo sull'host che stai tentando di utilizzare. Ad esempio, se stai tentando di clonare un repository Github per la prima volta su una nuova macchina Windows, usa PuTTY per aprire una sessione sull'host "github.com", accetta il prompt relativo alla fiducia del server, quindi un clone al la riga di comando dovrebbe funzionare.
Jeremy McGee

1
Puoi dire a MSYS che git sta tentando di usare plinkeseguendo $ set | grep GIT_SSHe controllandoGIT_SSH='C:\Program Files (x86)\PuTTY\plink.exe'
shuckc

2
Ho finito per risolverlo aggiungendo la mia chiave a Pageant e accedendo direttamente all'host con Putty. Questo ti chiede di aggiungere l'host alla cache. Facendo la stessa cosa.
Knossos,

1
Se il repository git è servita su una porta SSH personalizzato, utilizzare -Pper selezionare la porta, come ad esempio: plink.exe example.com -P 2222. Sono stato in grado di clonare da GitHub ma non dal mio server personale, e questo mi ha confuso a non finire.
Hay

79

Prova a fare un "set | grep -i ssh" dal prompt di Git Bash

Se la tua configurazione è come la mia, probabilmente hai questi set:

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

Ho fatto un

unset GIT_SSH
unset PLINK_PROTOCOL
unset GIT_SVN

e dopo ha funzionato, .. immagino che putty salvi le sue chiavi da qualche altra parte come $ HOME / .ssh o qualcosa del genere ... (Ho anche avuto un problema su una scatola in cui $ HOME era impostato su "C: \ Users \ usrnam "invece di" / C / Users / usrnam / "

comunque, il tuo chilometraggio può variare, ma questo lo ha risolto per me. :-)

(probabilmente è sufficiente eseguire il GIT_SSH non impostato, ma stavo andando bene)

Nota: se unset non funziona per te, prova questo:

set GIT_SSH=

1
"unset GIT_SSH" ha funzionato per me. Avevo già configurato Pageant / putty per un server diverso, ma quando ho creato nuove chiavi utilizzando il prompt di Git Bash, dovevo tornare indietro. Grazie per l'aiuto.
Supermitch

dopo aver eseguito i tuoi passi sono andato oltre ma ora ricevo un errore di "mac su input" ... mai visto quello?
CD Smith

2
Quando installi git puoi scegliere di NON impostare quelle variabili. È anche la variante predefinita. Anche se ho scelto anche l'integrazione di plink, ecco perché sono qui) Grazie.
Antony Hatchkins

1
Questo ha funzionato anche per me su Win7. Apparentemente la configurazione di git bash con plink stava causando il problema nel mio caso.
nhylated il

2
unset GIT_SSHha funzionato anche per me, anche se devo farlo ogni volta che lancio git bash, il che è abbastanza noioso. Qualche idea su come automatizzarlo?
Loïc

19

Sospetto che la tua GIT_SSHvariabile d'ambiente sia impostata su %ProgramFiles(x86)%\putty\plink.exe. Per qualche motivo, PLink non utilizza il .ssh/known_hostsfile nella directory utente per memorizzare le chiavi degli host remoti.

Se questo è effettivamente il tuo caso, e potrebbe essere così apposta se vuoi usare pageant, devi prima usare PLink per connetterti all'host.

"$GIT_SSH" user@hostname

Dovresti ricevere un messaggio simile

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)

Una volta che hai risposto yalla domanda e ti sei connesso con successo all'host remoto, dovresti essere pronto. Vai avanti e prova di nuovo a spingere.


Questo è stato per me usando Git Bash su Windows con PLink / Pageant. Grazie mille!
amsross

1
Usando un repository Stash (ora Bitbucket), ho dovuto usare"$GIT_SSH" -P 7999 git@stash.domain.local
Julien

4

Il semplice ssh'ing sull'host non è sufficiente, almeno su Windows. Ciò aggiunge la chiave host a ssh/known_hostsma l'errore persiste ancora.

È necessario chiudere la finestra git bash e aprirne una nuova. Quindi la cache del registro viene cancellata e il push / pull funziona.


ssh/known_hostsè relativo a cosa ?,% USERPROFILE% Sto riscontrando questo problema su Win 7 e nessuna soluzione ...
Frank Nocke

2

Rene, la tua HOMEvariabile non è impostata correttamente. Cambialo in c:\Users\(your-username)o semplicemente in %USERNAME%.


2

Soluzione con Plink

Salva questo script Python in 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

Testato su Win7x64 e Python 2.7 .

Quindi esegui:

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

E scegli di importare nel registro. Il keyscan recupererà la chiave pubblica per il dominio (ho avuto i miei problemi con bitbucket), quindi lo script python la convertirà in formato Plink.


2

Ha avuto lo stesso problema e dimentica di connetterti a SSH sulla porta dove si trova il repository effettivo , non solo la porta SSH generale, quindi la chiave host è diversa!


Utilizza anche lo stesso identico modo di specificare l'host, ad esempio non gitserver.example.com per ssh e gitserver per git.
Matthijs P

2

Basta aprire Putty e provare a stabilire la connessione al server remoto a cui si desidera inviare il codice. quando viene visualizzata la finestra di dialogo, premere Sì (ti fidi del telecomando), allora tutto sarebbe a posto.


2

Ambiente di lavoro:

  • Windows 10
  • idiota
  • mastice

Primo: Elimina putty known_hosts in registy secondo Regedit.
Quindi: l' esecuzione del comando %GIT_SSH% user@hostnamenel cmd di Windows risolve il problema.

Spero che aiuti tutti voi.


1

Anch'io ho avuto lo stesso problema quando stavo cercando di clonare un repository sulla mia macchina Windows 7. Ho provato la maggior parte delle risposte menzionate qui. Nessuno di loro ha funzionato per me.

Quello che ha funzionato per me è stato l'esecuzione del programma Pageant (Putty authentication agent). Una volta che il Pageant era in esecuzione in background, sono stato in grado di clonare, spingere e tirare da / al repository. Questo ha funzionato per me, potrebbe essere perché ho impostato la mia chiave pubblica in modo tale che ogni volta che viene utilizzata per la prima volta è richiesta una password e il Pageant si avvia.


Ricevi un altro messaggio di errore quando si tratta di un problema di spettacolo. No Connection abandoned, ma qualcosa comeAccess denied (private key)
Andrey Regentov

1

Il passaggio da PuTTY a OpenSSH ha risolto questo problema per me, senza dover annullare l'impostazione di GIT_SSH, ecc.


Se ricevi il messaggio sulla chiave host non riconosciuta mentre esegui operazioni git push / pull utilizzando ATLASSIAN SOURCETREE non hai la possibilità di rispondere y / ne l'operazione push / pull verrà interrotta senza memorizzare nella cache la chiave. Tuttavia, andando su Strumenti SourceTree-> Opzioni (scheda Generale) e cambiando il client SSH in (sotto Configurazione client SSH) da PuTTY a OpenSSH, la chiave verrà memorizzata nella cache senza modificare nient'altro.
Rod Dewell

1

Ho risolto un problema simile utilizzando questa soluzione alternativa .

Devi solo passare a Embedded Git, premere, premere il pulsante Sì e quindi tornare a System Git.

Puoi trovare questa opzione in

Tools -> Options -> Git

1
Ora sulla posizione v2.5.5.0:C:\Users\{UserName}\AppData\Local\SourceTree\app-2.5.5\tools\putty> .\plink.exe {YourNewHost}
John_J

1

Alla risposta di Roman Starkov , è plinknecessario aggiungere l'host alla sua cache.

Per le persone che utilizzano le estensioni Git :

  1. Apri estensioni Git
  2. Vai su Strumenti -> Impostazioni -> SSH
  3. Copia il percorso in "plink.exe" (se usi PuTTY) / "klink.exe" (se usi KiTTY)
  4. In una console, esegui il seguente comando:

(sostituire con i percorsi effettivi)

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

per esempio

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

Nota : assicurati di utilizzare lo stesso plink / klink utilizzato da Git Extensions!


0

L'aggiunta dell'host direttamente con Bash non ha risolto il problema, l'errore si verificava ancora quando si utilizzava "Recupera tutto" nelle estensioni Git. Utilizzando "Pull" su un ramo, l'host richiesto è stato aggiunto automaticamente da Git Extensions con una schermata pop-up Bash. Dopo aver fatto ciò, sono stato in grado di utilizzare di nuovo "Fetch All". Non sono sicuro di cosa sia fatto in modo diverso da Git Extensions.


0

Ho provato tutti i metodi sopra ma nessuno di loro è riuscito a risolvere lo stesso problema sul mio laptop. Infine, invece di spingere il ramo all'origine in git bash, trun per utilizzare l'opzione push di TortoiseGit per eseguire il push, quindi si apre una finestra per chiedermi di aggiungere la nuova chiave host alla cache, dopo aver fatto clic sul pulsante sì, tutto funziona bene adesso.

Spero che aiuti a tutti voi.


0

Ho cambiato un disco rigido, installato Windows. Quando ha provato a caricare i file ha ricevuto questa finestra di comando.

Ho premuto "y", poi Ctrl + C. Aperto putty.exe, aggiunto una vecchia chiave che è tornata a git e ho spinto i file.


0

Disinstalla semplicemente Git Extensions e installa di nuovo scegliendo OpenSSH invece di


0

In Windows 7 o 10, il trucco che ha funzionato per me è stato l'eliminazione della variabile di sistema GIT_SSH. Prima era impostato per utilizzare Plink, e ora è stato sostituito da Putty. Ciò stava causando l'errore Plink.exe

C'era anche una vecchia installazione di Git (versione a 32 bit) e l'aggiornamento a Git (ad esempio Git-2.20.1-64-bit.exe) poiché il PC era OS a 64 bit.

Comunque il Putty / Plink non è stato nemmeno utilizzato da Git poiché nell'installazione di Git era di default usare Open SSH.


0

Se ricevi il messaggio sulla chiave host non riconosciuta mentre esegui operazioni git push / pull utilizzando ATLASSIAN SOURCETREE non hai la possibilità di rispondere y / ne l'operazione push / pull verrà interrotta senza memorizzare nella cache la chiave. Tuttavia, andando su Strumenti SourceTree-> Opzioni (scheda Generale) e cambiando il client SSH in (sotto Configurazione client SSH) da PuTTY a OpenSSH, la chiave verrà memorizzata nella cache senza modificare nient'altro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.