git - ключ хоста сервера не кэшируется
Я пытаюсь перенести изменения из моего локального репо в удаленное репо. Когда я печатаю:
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%
это правильно?
21 ответ
Сообщение означает, что ключ хоста 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 ФОРМАТ ФАЙЛА).
Для тех из вас, кто настраивает 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-сервисов (отредактируйте, чтобы добавить больше):
- Github:
16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48
- Bitbucket:
97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40
- Gitorious:
7e:af:8d:ec:f0:39:5e:ba:52:16:ce:19:fa:d4:b8:7d
Попробуйте выполнить команду "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=
Я подозреваю, что ваш 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
на вопрос и успешно подключившись к удаленному хосту, у вас должно быть все готово. Иди и попробуй свой толчок снова.
Просто ssh'ing для хоста недостаточно, по крайней мере, для Windows. Это добавляет ключ хоста к ssh/known_hosts
но ошибка все еще сохраняется.
Вам нужно закрыть окно git bash и открыть новое. Затем кэш реестра очищается и работает push/pull.
Рабочая обстановка:
- Windows 10
- мерзавец
- шпатлевка
Во-первых, удалите putty known_hosts из реестра в соответствии с Regedit.
Затем: выполнение команды %GIT_SSH% user@hostname
в окне cmd решает проблему.
Надеюсь, это поможет вам всем.
Rene, your HOME
variable isn't set correctly. Либо измените его на c:\Users\(your-username)
or just to %USERNAME%
,
Если вы получаете сообщение о нераспознанном ключе хоста при выполнении операций git push/pull с использованием ATLASSIAN SOURCETREE, у вас нет возможности ответить y/n, и операция push / pull будет прервана без кэширования ключа. Однако переход в SourceTree Tools->Options (вкладка "Общие") и изменение клиента SSH в разделе (в разделе "Конфигурация клиента SSH") с PuTTY на OpenSSH позволит кэшировать ключ без каких-либо изменений.
Как ответил Роман Старков:plink
необходимо добавить хост в его кеш.
Для людей, использующих Git Extensions:
- Открыть расширения Git
- Перейдите в Инструменты -> Настройки -> SSH
- Скопируйте путь к "plink.exe" (при использовании PuTTY) / "klink.exe" (при использовании KiTTY)
- В консоли выполните следующую команду:
(заменить фактическими путями)
<the path to plink/klink.exe> <address to the server>
например
%ProgramData%\chocolatey\lib\kitty\tools\klink.exe codebasehq.com
Примечание: убедитесь, что вы используете тот же plink/klink, что и Git Extensions!
Просто откройте Putty и попытайтесь установить соединение с удаленным сервером, на который вы хотите отправить свой код. когда появится диалоговое окно, нажмите Да (вы доверяете удаленному), тогда все будет в порядке.
Решение с 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
И выбрать для импорта в реестр. Сканирование ключей извлечет открытый ключ для домена (у меня были проблемы с bitbucket), а затем скрипт python преобразует его в формат Plink.
Возникла такая же проблема, и забудьте о подключении к SSH на порту, где находится хранилище фактически, а не просто в общем порту SSH, тогда ключ хоста будет другим!
Я решил аналогичную проблему с помощью этого обходного пути.
Вам просто нужно переключиться на Embedded Git, нажать, нажать кнопку "Да", а затем переключиться обратно на System Git.
Вы можете найти эту опцию в
Tools -> Options -> Git
Переход с PuTTY на OpenSSH устранил эту проблему для меня без необходимости сбрасывать GIT_SSH и т. Д.
У меня тоже была такая же проблема, когда я пытался клонировать репозиторий на моей машине с Windows 7. Я попробовал большинство ответов, упомянутых здесь. Никто из них не работал для меня.
Что мне помогло, так это запуск программы Pageant (Агент аутентификации Putty). Как только Pageant работал в фоновом режиме, я смог клонировать, нажать и вытащить из / в хранилище. Это сработало для меня, возможно, потому, что я настроил свой открытый ключ так, чтобы при его первом использовании требуется пароль и запускается конкурс.
Я сменил жесткий диск, установил Windows. При попытке загрузить файлы получено это командное окно.
Я нажал "y", затем Ctrl + C. Открыл putty.exe
добавил старый ключ к git и отправил файлы.
В 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.
Я изменил свой SSH-ключ, и это произошло. Я попробовал какое-то решение, но оно не удалось, и я сдался. Наконец, я выбираю OpenSSH вместо PuTTY, и все работает :)
Я перепробовал все методы, описанные выше, но ни один из них не мог решить ту же проблему на моем ноутбуке. Наконец, вместо того, чтобы выдвигать ветку в origin в git bash, я использую опцию TortoiseGit, чтобы сделать pushing, затем появляется всплывающее окно с просьбой добавить новый ключ хоста в кеш, после нажатия кнопки yes, все идет хорошо сейчас.
Надеюсь, это поможет вам всем.
Добавление хоста напрямую с помощью Bash не решило проблему, ошибка по-прежнему возникала при использовании "Fetch all" в расширениях Git. Используя "Pull" в одной ветви, требуемый хост автоматически добавлялся Git Extensions с всплывающим экраном Bash. После этого я снова смог использовать "Fetch All". Не уверен, что делает Git Extensions иначе.
Просто удалите Git Extensions и установите снова, выбрав OpenSSH вместо