git - ключ хоста сервера не кешируется

101

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

git push origin

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

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

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

редактировать

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

ssh user@hostname

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

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

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

@eckes: Edit2

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

Рене Терстеген
источник
2
Похоже, что $HOMEнастроен неправильно. Попробуйте установить HOMEпеременную среды в окнах, используя My Computer-> щелкните правой кнопкой мыши -> Properties-> Tab Advanced-> ButtonEnvironment Variables
eckes
1
Я не специалист по Windows, но мне кажется странным, что после /c//(предположительно буквы диска) у вас все еще есть %HOMEDRIVE%... Возможно, вы сможете сэкономить время, поигравшись со значением самостоятельно и повторив его?
Cascabel
1
Разверните HOMEDRIVEи HOMEPATHи установите HOMEна полученное значение ...
eckes

Ответы:

54

Сообщение означает, что ключ хоста 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файла, как описано на странице руководства sshd(Раздел AUTHORIZED_KEYS FILE FORMAT ).

Eckes
источник
4
Я получил то же сообщение при нажатии на github, но я могу использовать ssh для github, и в моем known_hostsфайле есть github.com .
Magnus Lindhe
1
В этом случае см. Ответ ниже
Никита Кокшаров
3
Вы можете использовать PuTTY в Windows для тех же целей вместо SSH-клиента командной строки.
brianmearns
1
Убедитесь, что имена хостов точно такие же. Например, если у вас установлен git локально и вы используете имя home.mydomain.com в качестве удаленного, но сохраните ключ с помощью putty для подключения к localhost, это не сработает. Вам необходимо подключиться точно к имени хоста в вашем удаленном URL-адресе.
Джейсон Гоэмаат
Для меня исправлена ​​попытка подключиться с помощью шпатлевки к серверу. Допустим, git url - это ssh: //git@example.ex.com: 222 / something / shop.git, поэтому я вошел в поле имени хоста putty example.ex.com и порт 222. Затем соединение не удалось, но я думаю, он добавил палец распечатайте там, где это нужно. Я просто не понимаю, где он добавлен, потому что в моем домашнем каталоге known_hosts - файл не пострадал, когда я удалил старый ключ
Darius.V
157

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

> plink.exe <host>

Например:

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

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

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

Роман Старков
источник
15
Это должен быть принятый ответ. Это именно то, к чему относится сообщение об ошибке. В моем случае, когда я клонировал, я использовал полное доменное имя, но на моем новом компьютере я вошел в систему только с коротким локальным доменным именем. Мне пришлось войти в систему через putty или plink в качестве FQDN, чтобы кэшировать ключ для имени хоста в источнике. Это может помочь в перекрестной проверке имени хоста, используемого в качестве удаленного, с помощью "git remote -v".
peabody
3
Он также позволяет использовать интерактивный PuTTY для хоста, который вы пытаетесь использовать. Например, если вы впервые пытаетесь клонировать репозиторий Github на новой машине с Windows, используйте PuTTY, чтобы открыть сеанс с хостом github.com, примите запрос о доверии сервера, а затем выполните клонирование на командная строка должна работать.
Джереми МакГи
1
Вы можете сказать, что MSYS git пытается использовать plink, запустив$ set | grep GIT_SSH и проверивGIT_SSH='C:\Program Files (x86)\PuTTY\plink.exe'
shuckc
2
В итоге я решил эту проблему, добавив свой ключ в Pageant и напрямую подключившись к хосту с помощью Putty. Вам будет предложено добавить хост в кеш. Делаем то же самое.
Knossos
1
Если ваш репозиторий подается на пользовательский SSH порт, используйте -Pдля выбора порта, такие как: plink.exe example.com -P 2222. Я смог клонировать с github, но не с моего личного сервера, и это меня до бесконечности смутило.
Hay
79

Попробуйте выполнить "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=
Thijs
источник
1
"unset GIT_SSH" работал у меня. Ранее я настраивал Pageant / putty для другого сервера, но когда я создал новые ключи с помощью приглашения Git Bash, мне нужно было вернуться. Спасибо за помощь.
supermitch 08
после того, как я предпринял ваши шаги, я пошел дальше, но теперь я получаю ошибку "currupted mac on input" ... когда-нибудь видел это?
CD Smith
2
При установке git вы можете НЕ устанавливать эти переменные. Это даже вариант по умолчанию. Хотя я тоже выбрал интеграцию с plink, поэтому я здесь) Спасибо.
Энтони Хэтчкинс
1
У меня это тоже сработало на Win7. По-видимому, в моем случае проблема с настройкой git bash с plink.
nhylated
2
unset GIT_SSHу меня тоже сработало, хотя мне приходится делать это каждый раз, когда я запускаю git bash, что довольно скучно. Есть идеи, как это автоматизировать?
Loïc
19

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

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

"$GIT_SSH" user@hostname

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

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)

После того, как вы ответили yна вопрос и успешно подключились к удаленному хосту, все должно быть настроено. Давай, попробуй еще раз.

Gunee
источник
Это было для меня, когда я использовал Git Bash в Windows с PLink / Pageant. Спасибо!
Amsross
1
Мне пришлось использовать репозиторий Stash (теперь Bitbucket)"$GIT_SSH" -P 7999 git@stash.domain.local
Жюльен,
4

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

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

Andynormancx
источник
ssh/known_hostsотносится к чему ?,% USERPROFILE% У меня проблема с Win 7, и решения нет ...
Фрэнк Нок,
2

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

Реза Ф
источник
2

Решение с Plink

Сохраните этот скрипт 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

Проверено на 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

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

Хенрик
источник
2

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

Матеуш
источник
Также используйте тот же способ указания хоста, например, не gitserver.example.com для ssh и gitserver для git.
Matthijs P
2

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

Садех Саати
источник
2

Рабочая обстановка:

  • Windows 10
  • мерзавец
  • замазка

Во-первых: удалите putty known_hosts из реестра в соответствии с Regedit.
Затем: Выполнение команды %GIT_SSH% user@hostnameв cmd Windows решает проблему.

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

Джейсон 徐
источник
1

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

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

Сунилкумарба
источник
Вы получаете другое сообщение об ошибке, когда возникает проблема с конкурсом. Нет Connection abandoned, но что-то вродеAccess denied (private key)
Андрей Регентов
1

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

79E09796
источник
Если вы получаете сообщение о нераспознанном ключе хоста при выполнении операций git push / pull с использованием ATLASSIAN SOURCETREE, у вас нет возможности ответить y / n, и операция push / pull будет прервана без кэширования ключа. Однако переход в SourceTree Tools-> Options (вкладка «Общие») и изменение клиента SSH в разделе (в разделе «Конфигурация клиента SSH») с PuTTY на OpenSSH позволит кэшировать ключ без каких-либо изменений.
Род Дьюэлл,
1

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

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

Вы можете найти эту опцию в

Tools -> Options -> Git
Поджигатель2266
источник
1
Теперь в локации v2.5.5.0:C:\Users\{UserName}\AppData\Local\SourceTree\app-2.5.5\tools\putty> .\plink.exe {YourNewHost}
John_J
1

Как ответил Роман Старков , plinkнеобходимо добавить хост в его кеш.

Для людей, использующих Git Extensions :

  1. Открыть расширения Git
  2. Перейдите в Инструменты -> Настройки -> SSH
  3. Скопируйте путь к «plink.exe» (при использовании PuTTY) / «klink.exe» (при использовании KiTTY)
  4. В консоли выполните следующую команду:

(заменить фактическими путями)

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

например

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

Примечание : убедитесь, что вы используете тот же plink / klink, что и Git Extensions!

Рейн
источник
0

Добавление хоста напрямую с помощью Bash не решило проблему, ошибка по-прежнему возникала при использовании «Получить все» в Git Extensions. При использовании «вытягивания» в одной ветке требуемый хост был автоматически добавлен Git Extensions с всплывающим экраном Bash. После этого я снова смог использовать «Получить все». Не уверен, что Git Extensions делает иначе.

Барт VdA
источник
0

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

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

Аллен Джин
источник
0

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

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

CoolMind
источник
0

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

Kiran.vanam
источник
0

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

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

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

ДонАристон
источник
0

Если вы получаете сообщение о нераспознанном ключе хоста при выполнении операций git push / pull с использованием ATLASSIAN SOURCETREE, у вас нет возможности ответить y / n, и операция push / pull будет прервана без кэширования ключа. Однако переход в SourceTree Tools-> Options (вкладка «Общие») и изменение клиента SSH в разделе (в разделе «Конфигурация клиента SSH») с PuTTY на OpenSSH позволит кэшировать ключ без каких-либо изменений.

Род Дьюэлл
источник