106

我尝试将更改从本地仓库推送到远程仓库。当我输入:

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

我该如何解决这个问题?我在 Windows 7 的命令行中使用 git。

编辑

当我尝试做一个简单的 ssh

ssh user@hostname

我收到以下错误:

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

不知何故,它不会创建目录,因为路径无效。如何解决这个问题?

@eckes:编辑2

我的家设置为%HOMEDRIVE%%HOMEPATH%正确吗?

4

20 回答 20

164

对于那些通过标准命令提示符使用 PuTTY 在 Windows 上设置 MSYS Git 的人来说,将主机添加到 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 服务的指纹(请编辑添加更多):

于 2012-09-16T17:19:28.140 回答
81

尝试从 Git Bash 提示符执行“set | grep -i ssh”

如果你的设置和我的一样,你可能有这些设置:

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/Users/usrnam/”

无论如何,您的里程可能会有所不同,但这对我来说是固定的。:-)

(可能只做未设置的 GIT_SSH 就足够了,但我很高兴)

注意:如果 unset 对您不起作用,请尝试以下操作:

set GIT_SSH=
于 2012-02-21T22:22:05.473 回答
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)?

如果您信任远程主机(即 type yes),SSH 会将其密钥添加到已知主机列表中。

在那之后,你应该可以做你的git push origin.

作为替代方案,您也可以手动添加 to 的密钥,origin但这.ssh/known_hosts要求您遵守(第AUTHORIZED_KEYS FILE FORMATknown_hosts部分)手册页中所述的文件格式。sshd

于 2011-02-08T09:39:01.347 回答
20

我怀疑您的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完问题并成功连接到远程主机后,您应该已准备就绪。继续尝试再次推动。

于 2013-04-01T21:40:06.627 回答
4

至少在 Windows 上,仅 ssh'ing 到主机是不够的。这会添加主机密钥,ssh/known_hosts但错误仍然存​​在。

您需要关闭 git bash 窗口并打开一个新窗口。然后清除注册表缓存,然后推/拉工作。

于 2012-02-03T18:54:45.137 回答
2

Rene,您的HOME变量设置不正确。将其更改为c:\Users\(your-username)或仅更改为%USERNAME%.

于 2012-07-11T16:08:33.940 回答
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

并选择导入注册表。keyscan 将检索域的公钥(我遇到了 bitbucket 的问题),然后 python 脚本将其转换为 Plink 格式。

于 2012-08-23T15:29:08.953 回答
2

有同样的问题,忘记在实际存储库的端口上连接到 SSH,而不仅仅是一般的 SSH 端口,那么主机密钥是不同的!

于 2013-08-22T10:19:42.090 回答
2

只需打开 Putty 并尝试与要推送代码的远程服务器建立连接。当对话框出现时按是(你信任远程)然后一切都会好的。

于 2015-02-02T06:34:00.973 回答
2

工作环境:

  • 视窗 10
  • 混帐
  • 油灰

第一:根据注册表删除注册表中的putty known_hosts。
然后:在Window的cmd中执行命令%GIT_SSH% user@hostname即可解决问题。

希望对大家有帮助。

于 2017-06-01T09:08:37.657 回答
1

当我尝试在我的 Windows 7 机器上克隆存储库时,我也遇到了同样的问题。我尝试了这里提到的大部分答案。他们都没有为我工作。

对我有用的是运行Pageant(Putty 身份验证代理)程序。一旦选美在后台运行,我就可以从/向存储库克隆、推送和拉取。这对我有用,可能是因为我已经设置了我的公钥,以便在第一次使用它时需要密码并且选美启动。

于 2014-02-12T14:00:53.480 回答
1

从 PuTTY 更改为 OpenSSH 为我解决了这个问题,无需取消设置 GIT_SSH 等。

于 2015-03-10T12:08:22.383 回答
1

我使用此解决方法解决了类似的问题。

你只需要切换到 Embedded Git,按下,按 Yes 按钮,然后切换回 System Git。

您可以在

Tools -> Options -> Git
于 2015-12-16T12:59:59.077 回答
1

正如Roman Starkov所回答的,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

注意:确保使用与 Git Extensions 相同的 plink/klink!

于 2020-03-11T06:40:06.623 回答
0

直接用 Bash 添加主机并没有解决问题,在 Git Extensions 中使用 'Fetch all' 时仍然出现错误。通过在一个分支上使用“Pull”,Git Extensions 使用 Bash 弹出屏幕自动添加了所需的主机。完成此操作后,我可以再次使用“获取全部”。不确定 Git Extensions 做了什么不同的事情。

于 2016-06-01T10:50:35.920 回答
0

我已经尝试了上述所有方法,但它们都无法解决我笔记本电脑上的相同问题。最后,我没有在 git bash 中将分支推送到原点,而是使用 TortoiseGit 的 push 选项进行推送,然后弹出一个窗口要求我将新的主机密钥添加到缓存,单击是按钮后,一切正常现在好了。

希望对大家有所帮助。

于 2017-01-10T02:40:20.040 回答
0

我换了一个硬盘,装了Windows。尝试上传文件时收到此命令窗口。

我按“y”,然后按 Ctrl + C。打开putty.exe,添加一个旧键然后返回到 git 并推送文件。

于 2018-11-15T07:55:31.700 回答
0

在 Windows 7 或 10 中,对我有用的技巧是删除 GIT_SSH 系统变量。之前设置使用 Plink,现在被 Putty 取代。这导致了 Plink.exe 错误

由于 PC 是 64 位操作系统,因此还安装了旧版 Git(32 位版本)并更新到 Git(例如 Git-2.20.1-64-bit.exe)。

无论如何,Git 甚至没有使用 Putty/Plink,因为在 Git 安装中默认使用 Open SSH。

于 2019-09-18T03:40:57.530 回答
0

如果您在使用 ATLASSIAN SOURCETREE 执行 git push/pull 操作时收到有关无法识别的主机密钥的消息,您将无法回答 y/n,并且 push/pull 操作将在不缓存密钥的情况下中止。但是,转到 SourceTree Tools->Options(常规选项卡)并将(在 SSH 客户端配置下)下的 SSH 客户端从 PuTTY 更改为 OpenSSH 将允许在不更改任何其他内容的情况下缓存密钥。

于 2020-07-07T13:32:57.957 回答
-1

只需卸载 Git Extensions 并通过选择 OpenSSH 而不是再次安装

于 2019-07-17T07:44:56.510 回答