Git - Ключ хоста сервера не кэширован

Я пытаюсь внести изменения с моего локального репо на удаленное репо. Когда я печатаю:

git push origin

Я получаю следующую ошибку:

The server host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server 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

Как я могу это решить? Я использую git из командной строки в Windows 7.

Edit

Когда я пытаюсь сделать простой ssh ​​

ssh [email protected]

Я получаю следующую ошибку:

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

Как-то он не будет создавать каталог, потому что путь недействителен. Как это исправить?

@eckes: Edit2

Мой дом установлен на %HOMEDRIVE%%HOMEPATH%, это правильно?

Ответ 1

Сообщение означает, что хост ключ origin нет в вашем доверенных хостов файла.

Чтобы обойти это, откройте простое SSH-соединение с origin и SSH спросит вас, хотите ли вы доверять удаленному хосту (из консоли 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)?

Если вы доверяете удаленному хосту (то есть набираете yes), SSH добавит свой ключ в список известных хостов.

После этого вы сможете выполнить свою git push origin.

В качестве альтернативы вы также можете вручную добавить ключ origin в .ssh/known_hosts но для этого необходимо придерживаться формата файла known_hosts как описано на странице known_hosts sshd (раздел AUTHORIZED_KEYS FILE FORMAT).

Ответ 2

Для тех из вас, кто настраивает MSYS Git в Windows, используя PuTTY через стандартную командную строку, способ добавить хост в кэш PuTTY - запустить

> plink.exe <host>

Например:

> plink.exe codebasehq.com

The server host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server 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 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)

Просто ответьте y, а затем Ctrl + C остальное.

Проверьте fingerprint все же. Это предупреждение есть по уважительной причине. Отпечатки пальцев для некоторых сервисов git (пожалуйста, отредактируйте, чтобы добавить больше):

Ответ 3

Попробуйте выполнить "set | grep -i ssh" из приглашения Git Bash

Если ваша установка похожа на мою, вы, вероятно, имеете следующие настройки:

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

Я сделал

unset GIT_SSH
unset PLINK_PROTOCOL
unset GIT_SVN

и это сработало после этого.. Я думаю, что putty сохраняет свои ключи где-то еще как $HOME/.ssh или что-то в этом роде (у меня также была проблема с коробкой, где $HOME была установлена ​​на "C:\Users\usrnam" вместо "/C/Users/usrnam/"

в любом случае, ваш пробег может отличаться, но это исправлено для меня.: -)

(возможно, просто делать неустановленный GIT_SSH достаточно, но я был в рулоне)

Примечание: если функция unset не работает для вас, попробуйте следующее:

set GIT_SSH=

Ответ 4

Я подозреваю, что для переменной среды GIT_SSH установлено значение %ProgramFiles(x86)%\putty\plink.exe. По какой-то причине PLink не использует файл .ssh/known_hosts в вашем каталоге пользователя для хранения ключей удаленных хостов.

Если это действительно ваш случай, и это может быть так специально, если вы хотите использовать конкурс, вам нужно использовать PLink для подключения к хосту.

"$GIT_SSH" [email protected]

Вы должны получить аналогичное сообщение

The server host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server 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 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)

Как только вы ответили на вопрос y и успешно подключились к удаленному хосту, вы должны быть настроены. Идите дальше и повторите попытку.

Ответ 5

Просто ssh'ing для хоста недостаточно, по крайней мере на Windows. Это добавляет ключ хоста к ssh/known_hosts, но ошибка все еще сохраняется.

Вам нужно закрыть окно git bash и открыть новый. Затем кэш реестра очищается, а затем работает push/pull.

Ответ 6

Rene, ваша переменная HOME установлена ​​неправильно. Либо измените его на c:\Users\(your-username), либо просто на %USERNAME%.

Ответ 7

Имел ту же проблему и забыл подключиться к SSH на порту, где находится репозиторий actall, а не только общий SSH-порт, тогда ключ хоста отличается!

Ответ 8

Рабочая среда:

  • Windows 10
  • git
  • шпатлевка

Сначала: Удалите putty known_hosts в registy в соответствии с Regedit.
Затем: Выполнение команды %GIT_SSH% [email protected] в окне cmd решает проблему.

Надеюсь, это поможет всем вам.

Ответ 9

Решение с Plink

Сохранить этот python script до 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 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 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: '[email protected]: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

Протестировано на Win7x64 и Python 2.7.

Затем запустите:

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

И выберите импорт в реестр. Keyscan будет извлекать открытый ключ для домена (у меня были проблемы с bitbucket), а затем python script преобразует его в формат Plink.

Ответ 10

У меня тоже была такая же проблема, когда я пытался клонировать репозиторий на моей машине с Windows 7. Я попробовал большинство ответов, упомянутых здесь. Никто из них не работал у меня.

Что сработало для меня, это запустить программу Pageant (Putty authentication agent). Как только Пейнт работал в фоновом режиме, я смог клонировать, нажимать и извлекать из/в репозиторий. Это сработало для меня, возможно, потому, что я установил свой открытый ключ таким образом, что всякий раз, когда он используется в первый раз, требуется пароль и запускается Pageant.

Ответ 11

Просто откройте Putty и попробуйте установить соединение с удаленным сервером, который вы хотите нажать на свой код. когда появится диалоговое окно, нажмите "Да" (вы доверяете удаленному), тогда все будет в порядке.

Ответ 12

Я решил аналогичную проблему, используя этот обходной путь.

Вам просто нужно переключиться на Embedded Git, нажать, нажать кнопку Да, а затем вернуться к Системе Git.

Этот параметр можно найти в

Tools -> Options -> Git

Ответ 13

Переход с PuTTY на OpenSSH исправил эту проблему для меня, без необходимости отключать GIT_SSH и т.д.

Ответ 14

Добавление узла непосредственно с помощью Bash не решило проблему, ошибка все еще возникала при использовании "Fetch all" в Git Extensions. Используя "Pull" на одной ветке, требуемый хост был добавлен автоматически с помощью Git Extensions с всплывающим окном Bash. После этого я смог снова использовать "Fetch All". Не уверен, что сделано с помощью Git Расширений по-разному.

Ответ 15

Я пробовал все вышеперечисленные методы, но ни один из них не смог исправить эту проблему на моем ноутбуке. Наконец, вместо того, чтобы перевести ветвь в начало в git bash, я перешел на использование опции TortoiseGit push для выполнения pushing, затем всплывающее окно, чтобы попросить меня добавить новый ключ хоста в кеш, после нажатия кнопки yes Теперь все будет хорошо.

Надеюсь, это поможет вам всем.

Ответ 16

Я сменил жесткий диск, установил Windows. При попытке загрузить файлы получено это командное окно.

Я нажал "y", затем Ctrl + C. Открыл putty.exe, добавил старый ключ и вернулся в git и нажал на файлы.

Ответ 17

Просто удалите Git Extensions и установите снова, выбрав OpenSSH вместо

Ответ 18

В Windows 7 или 10 уловка, которая сработала для меня, это удаление системной переменной GIT_SSH. Раньше он был установлен для использования Plink, а теперь был заменен на Putty. Это вызывало ошибку Plink.exe

Была также старая установка Git (32-разрядная версия) и обновление до Git (например, Git-2.20.1-64-bit.exe), поскольку ПК был 64-разрядной ОС.

В любом случае Git даже не использовал Putty/Plink, поскольку при установке Git по умолчанию использовался Open SSH.