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змінну середовища на Windows за допомогою My Computer-> клацання правою кнопкою миші -> Properties-> Tab Advanced-> КнопкаEnvironment Variables
eckes

1
Я не хлопець з Windows, але це вражає мене, як це не дивно, що після /c//(імовірно, листа диска) у вас все ще є %HOMEDRIVE%... Ви, можливо, зможете заощадити собі час, знайшовшись із цінністю і повторюючи це?
Каскабель

1
Розгорніть HOMEDRIVEі HOMEPATHвстановіть HOMEотримане значення ...
eckes

Відповіді:


54

Повідомлення означає, що хост-ключ originвідсутній у вашому довіреному файлі хостів.

Щоб обійти це, відкрийте звичайне підключення SSH до originSSH і 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 ).


4
Я отримав те саме повідомлення під час натискання на github, але я можу ssh до github, і я маю github.com у своєму known_hostsфайлі.
Магнус Ліндхе

1
Подивіться відповідь нижче в цьому випадку
Микита Кокшаров

3
Ви можете використовувати PuTTY у Windows для тих же цілей, замість командного рядка клієнта SSH.
brianmearns

1
Переконайтесь, що імена хостів точно однакові. Наприклад, якщо у вас git встановлений локально і ви використовуєте назву 'home.mydomain.com' як свій пульт, але зберігайте ключ, використовуючи шпаклівку для підключення до 'localhost', це не спрацює. Вам потрібно підключитися саме до імені хоста у віддаленій URL-адресі.
Джейсон Гімаат

Для мене виправлена ​​спроба підключитися з шпаклівкою до сервера Скажімо, URL-адреса git - це ssh: //git@example.ex.com: 222 / something / shop.git, тому я ввійшов у поле putty ім'я хосту example.ex.com та порт 222. Тоді з’єднання не вдалося, але, мабуть, додав палець друкуйте там, де це було потрібно. Я просто не розумію, куди він додав, тому що в моєму домашньому каталозі unknown_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
Це має бути прийнятою відповіддю. Саме на це посилається повідомлення про помилку. У моєму випадку, коли я клонувався, я використовував FQDN, але на своїй новій машині я ввійшов у систему лише за допомогою короткого локального доменного імені. Мені довелося увійти через 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, але не з мого особистого сервера, і це збентежило мене не до кінця.
Сіно

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

і це спрацювало після цього, .. я думаю, що шпаклівка зберігає свої ключі десь в іншому місці як $ HOME / .ssh або щось подібне ... (У мене також була проблема у вікні, де $ HOME було встановлено на "C: \ Users \ usrnam "замість" / C / Користувачі / usrnam / "

у будь-якому випадку ваш пробіг може змінюватись, але це зафіксувало мене. :-)

(напевно, достатньо просто зробити невстановлений GIT_SSH, але я був у списку)

Примітка. Якщо скидання не працює для вас, спробуйте:

set GIT_SSH=

1
"unset GIT_SSH" працював на мене. Я раніше налаштовував Pageant / putty для іншого сервера, але коли я створив нові ключі за допомогою підказки Git Bash, мені потрібно було повернутися назад. Дякую за допомогу.
суперміт

після виконання ваших кроків я дістався далі, але тепер я отримую помилку "зіпсований мак на вході" ... коли-небудь бачив цю?
CD Smith

2
Під час встановлення git ви можете НЕ встановлювати ці змінні. Це навіть варіант за замовчуванням. Хоча я теж вибрав інтеграцію, тому я тут) Дякую.
Антоні Хеткінс

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файл у вашому каталозі користувачів для зберігання віддалених ключів хостів.

Якщо це справді ваш випадок, і це може бути навмисно, якщо ви хочете використовувати конкурс, вам потрібно спочатку скористатися 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на запитання та успішно підключились до віддаленого хоста, вам слід все налаштувати. Вперед і спробуйте знову натиснути.


Це було для мене за допомогою Git Bash на windows з PLink / Pageant. Дуже дякую!
amsross

1
Використовуючи сховище Stash (тепер Bitbucket), мені довелося скористатись"$GIT_SSH" -P 7999 git@stash.domain.local
Жульєн

4

Просто ssh'ing хосту недостатньо, принаймні в Windows. Це додає ключ хосту, ssh/known_hostsале помилка все ще зберігається.

Вам потрібно закрити вікно git bash та відкрити нове. Тоді очищається кеш реєстру, а потім працює "push / pull".


ssh/known_hostsє відносним до чого ?,% USERPROFILE% У мене виникає ця проблема на Win 7, і немає рішення ...
Frank Nocke

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

І вибрати імпорт до реєстру. Ключскань зможе отримати відкритий ключ домену (у мене були проблеми з бітбукетом), і тоді сценарій python перетворить його у формат Plink.


2

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


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

2

Просто відкрийте Putty і спробуйте встановити з'єднання з віддаленим сервером, на який ви хочете натиснути свій код. коли з'явиться діалогове вікно, натисніть Так (ви довіряєте віддаленому), тоді все буде добре.


2

Робоче середовище:

  • Windows 10
  • git
  • шпаклівка

По-перше: видаліть шпаклівку знаних_хостів у реєстрі відповідно до Regedit.
Потім: Виконання команди %GIT_SSH% user@hostnameв cmd Window вирішує проблему.

Сподіваюся, це допоможе вам усім.


1

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

Що для мене працювало - запуск програми Pageant (агент автентифікації Putty). Після того, як Pageant працює у фоновому режимі, я зміг клонувати, натискати та витягувати з / до сховища. Це спрацювало для мене, можливо, тому що я налаштував свій відкритий ключ таким чином, що коли він використовується вперше, потрібно ввести пароль і запускається Pageant.


Ви отримуєте інше повідомлення про помилку, коли це проблематика. Ні Connection abandoned, але щось на кшталтAccess denied (private key)
Андрій Регентов

1

Перехід від PuTTY на OpenSSH вирішив цю проблему для мене, не потрібно знімати GIT_SSH тощо.


Якщо ви отримаєте повідомлення про нерозпізнаний хост-ключ під час виконання операцій "git push / pull" за допомогою ATLASSIAN SOURCETREE, у вас немає можливості відповісти у / н, і операція "push / pull" буде перервана без кешування ключа. Однак перехід до SourceTree Tools-> Параметри (Загальна вкладка) та зміна SSH-клієнта в (під SSH-конфігурацією клієнта) з PuTTY на OpenSSH дозволить кешувати ключ, не змінюючи нічого іншого.
Rod Dewell

1

Я вирішив подібну проблему, використовуючи цей спосіб вирішення .

Вам просто потрібно перейти на Embedded Git, натиснути, натиснути кнопку Так і повернутись назад до System Git.

Ви можете знайти цю опцію в

Tools -> Options -> Git

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 :

  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

Примітка . Не забудьте використовувати той самий планк / klink, який використовує Git Extensions!


0

Додавання хоста безпосередньо до Bash не вирішило проблему, помилка все ж сталася під час використання "Вилучити всіх" у Git Extensions. Використовуючи "Потягнути" на одній гілці, потрібний хост автоматично додається через розширення Git із спливаючим екраном Bash. Після цього я знову зміг скористатися функцією "Витягнути все". Не впевнений, що по-різному робиться за допомогою Git Extensions.


0

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

Сподіваюсь, це допоможе вам усім.


0

Я змінив жорсткий диск, встановив Windows. При спробі завантаження файлів отримано це командне вікно.

Я натиснув "y", потім Ctrl + C. Відкрив putty.exe, додав стару клавішу, повернувся до git і натиснув файли.



0

У Windows 7 або 10 фокус, який працював для мене, - це видалення системної змінної GIT_SSH. Він був встановлений раніше для використання Plink, а тепер його замінив Putty. Це спричинило помилку Plink.exe

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

У всякому разі, Putit / Plink навіть не використовувався Git, оскільки в установці Git за замовчуванням було використано Open SSH.


0

Якщо ви отримаєте повідомлення про нерозпізнаний хост-ключ під час виконання операцій "git push / pull" за допомогою ATLASSIAN SOURCETREE, у вас немає можливості відповісти у / н, і операція "push / pull" буде перервана без кешування ключа. Однак перехід до SourceTree Tools-> Параметри (Загальна вкладка) та зміна SSH-клієнта в (під SSH-конфігурацією клієнта) з PuTTY на OpenSSH дозволить кешувати ключ, не змінюючи нічого іншого.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.