web-dev-qa-db-fra.com

git - Clé de l'hôte serveur non mise en cache

J'essaie de transférer les modifications de mon dépôt local vers un dépôt distant. Quand je tape:

git Push Origin

Je reçois l'erreur suivante:

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

Comment puis-je résoudre ça? J'utilise git depuis la ligne de commande de Windows 7.

Modifier

Quand j'essaye de faire un ssh simple

ssh user@hostname

Je reçois l'erreur suivante:

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

D'une manière ou d'une autre, le répertoire ne sera pas créé car le chemin n'est pas valide. Comment régler ceci?

@eckes: Edit2

Ma maison est définie sur %HOMEDRIVE%%HOMEPATH% est-ce correct?

96
Rene Terstegen

Le message signifie que la clé d'hôte de Origin n'est pas présente dans votre fichier d'hôtes de confiance.

Pour résoudre ce problème, ouvrez une connexion SSH simple à Origin et SSH vous demandera si vous souhaitez faire confiance à l'hôte distant (à partir de la 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)?

Si vous faites confiance à l'hôte distant (tapez yes), SSH ajoutera sa clé à la liste des hôtes connus.

Après cela, vous devriez pouvoir faire votre git Push Origin.

Vous pouvez également ajouter manuellement la clé Origin à .ssh/known_hosts, mais vous devez respecter le format du fichier known_hosts décrit dans la page de manuel de sshd (Section AUTHORIZED_KEYS FILE FORMAT). .

53
eckes

Pour ceux d'entre vous qui configurent MSYS Git sous Windows à l'aide de PuTTY via la commande standard Invite, la méthode permettant d'ajouter un hôte au cache de PuTTY consiste à exécuter

> plink.exe <Host>

Par exemple:

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

Répondez simplement y, puis Ctrl + C au reste.

Vérifiez bien les empreintes digitales. Cet avertissement existe pour une bonne raison. Empreintes digitales pour certains services git (veuillez modifier pour en ajouter plus):

148
Roman Starkov

Essayez de faire un "set | grep -i ssh" à partir de l'invite Git Bash

Si votre configuration est semblable à la mienne, vous avez probablement les éléments suivants:

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

J'ai fait un 

unset GIT_SSH
unset PLINK_PROTOCOL
unset GIT_SVN

et cela a fonctionné par la suite, .. Je suppose que PuTTY enregistre ses clés ailleurs sous le nom $ HOME/.ssh ou quelque chose du genre ... usrnam "au lieu de"/C/Users/usrnam/" 

de toute façon, votre kilométrage peut varier, mais cela l’a réglé pour moi. :-)

(il suffit probablement de ne pas définir GIT_SSH non défini, mais j'étais sur une lancée)

Remarque: si la désactivation ne fonctionne pas pour vous, essayez ceci:

set GIT_SSH=
77
Thijs

Je suppose que votre variable d'environnement GIT_SSH est définie sur %ProgramFiles(x86)%\PuTTY\plink.exe. Pour une raison quelconque, PLink n'utilise pas le fichier .ssh/known_hosts de votre répertoire utilisateur pour stocker les clés des hôtes distants.

Si tel est votre cas et si vous le souhaitez, vous devez d'abord utiliser PLink pour vous connecter à l'hôte.

"$GIT_SSH" user@hostname

Vous devriez recevoir un message similaire

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)

Une fois que vous avez répondu y à la question et que vous vous êtes connecté avec succès à l'hôte distant, vous devriez être prêt. Allez-y et essayez à nouveau votre Push.

18
Gunee

Simplement envoyer un message à l'hôte ne suffit pas, du moins sous Windows. Cela ajoute la clé de l'hôte à ssh/known_hosts, mais l'erreur persiste toujours.

Vous devez fermer la fenêtre git bash et en ouvrir une nouvelle. Ensuite, le cache de registre est effacé et le Push/Pull fonctionne alors.

4
andynormancx

Avait le même problème, et oubliez de vous connecter à SSH sur le port où se trouve le référentiel réel , pas seulement le port SSH général, alors la clé de l'hôte est différente!

2
Mateusz

René, votre variable HOME n'est pas définie correctement. Changez le en c:\Users\(your-username) ou simplement en %USERNAME%.

2
rezsa f

Environnement de travail:  

  • Windows 10
  • git
  • Mastic

Premièrement: Supprimez PuTTY known_hosts dans un registre conformément au Regedit.
Ensuite: L'exécution de la commande %GIT_SSH% user@hostname dans le cmd de Window résout le problème.

J'espère que cela vous aide tous.

2
Jason 徐

Moi aussi j'ai eu le même problème lorsque j'essayais de cloner un référentiel sur ma machine Windows 7. J'ai essayé la plupart des réponses mentionnées ici. Aucun d'entre eux n'a fonctionné pour moi. 

Ce qui a fonctionné pour moi a été l’exécution du programme Pageant (agent d’authentification PuTTY). Une fois que le concours s’est déroulé à l’arrière-plan, j’ai été en mesure de cloner, de pousser et d’extraire du/vers le référentiel. Cela a fonctionné pour moi, peut-être parce que j'ai configuré ma clé publique de telle sorte que chaque fois qu'elle est utilisée pour la première fois, un mot de passe est requis et le défilé démarre.

1
sunilkumarba

J'ai résolu le même problème en utilisant cette solution workaround .

Il vous suffit de basculer sur Gedded Embed, d’appuyer sur le bouton Oui, puis de revenir sur System Git.

Vous pouvez trouver cette option dans

Tools -> Options -> Git
1
Pyro

Il suffit d’ouvrir PuTTY et d’essayer d’établir une connexion avec le serveur distant sur lequel vous souhaitez pousser votre code. Lorsque la boîte de dialogue apparaît, appuyez sur Oui (vous faites confiance à distance), puis tout ira bien.

1
sadegh saati

Solution avec Plink

Enregistrer ce script python à 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

Testé sur Win7x64 et Python 2.7 .

Puis lancez:

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

Et choisissez d'importer dans le registre. Keyscan récupère la clé publique du domaine (j'ai eu des problèmes avec bitbucket), puis le script python la convertit au format Plink.

1
Henrik

Le passage de PuTTY à OpenSSH a corrigé ce problème pour moi, sans avoir besoin de désactiver GIT_SSH, etc.

0
79E09796

Il suffit de désinstaller Git Extensions et d’installer à nouveau en choisissant OpenSSH au lieu de

0
Kiran.vanam

L'ajout de l'hôte directement avec Bash n'a pas résolu le problème. L'erreur se produisait toujours lors de l'utilisation de "Fetch all" dans Git Extensions. En utilisant "Pull" sur une branche, l'hôte requis a été ajouté automatiquement par Git Extensions avec un écran contextuel Bash. Après cela, j'ai pu utiliser «Fetch All» à nouveau. Pas sûr de ce que Git Extensions fait différemment.

0
Bart VdA

J'ai changé un disque dur, installé Windows. Lorsque essayé de télécharger des fichiers a reçu cette fenêtre de commande.

J'ai appuyé sur "y", puis sur Ctrl + C. Open PuTTY.exe, ajouté une ancienne clé là retourné à git et poussé des fichiers.

0
CoolMind

J'ai essayé toutes les méthodes ci-dessus, mais aucune d'entre elles ne pouvait résoudre le même problème sur mon ordinateur portable. Enfin, au lieu de pousser la branche sur Origin dans git bash, je me permets d'utiliser l'option Push de TortoiseGit pour effectuer le push, puis une fenêtre s'ouvre pour me demander d'ajouter la nouvelle clé d'hôte à mettre en cache, après avoir cliqué sur le bouton yes bien maintenant.

J'espère que cela vous aidera tous.

0
Allen Jin