git - 未缓存服务器主机密钥

时间:2011-02-08 09:31:08

标签: windows git ssh putty plink

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

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: Edit2

我的主页设置为%HOMEDRIVE%%HOMEPATH%这是正确的吗?

20 个答案:

答案 0 :(得分:149)

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

答案 1 :(得分:77)

尝试从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

之后它起作用了..我猜putty将其键保存在其他地方作为$ HOME / .ssh或其他东西......(我在$ HOME设置为“C:”的盒子上也遇到了问题: \ Users \ usrnam“而不是”/ C / Users / usrnam /“

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

(可能只是做了未设置的GIT_SSH就足够了,但我还在滚动)

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

set GIT_SSH=

答案 2 :(得分:53)

该消息表示您的可信主机文件中不存在origin的主机密钥。

要解决此问题,请打开与origin的纯SSH连接,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文件格式一节。)

答案 3 :(得分:18)

我怀疑您的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问题并成功连接到远程主机,就应该全部设置好。继续尝试再次尝试。

答案 4 :(得分:4)

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

工作环境:

  • Windows 10
  • GIT中
  • 腻子

首先:根据Regedit在注册中删除putty known_hosts。
然后:在Window的cmd中执行命令%GIT_SSH% user@hostname解决了这个问题。

希望它能帮到你们所有人。

答案 8 :(得分:1)

使用Plink解决方案

this 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'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格式。

答案 9 :(得分:1)

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

对我有用的是,运行 Pageant (Putty身份验证代理)计划。一旦选美在后台运行,我就能克隆,推送和播放从/到存储库。这对我有用,可能是因为我设置了我的公钥,这样无论何时第一次使用密码都需要&amp;选美比赛开始了。

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

您只需切换到嵌入式Git,按,按是按钮,然后切换回System Git。

您可以在

中找到此选项
Tools -> Options -> Git

答案 12 :(得分:1)

Roman Starkov回答说,plink需要将主机添加到其缓存中。

对于使用 Git扩展程序的人:

  1. Open 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!

答案 13 :(得分:0)

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

答案 14 :(得分: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。

答案 15 :(得分:0)

只需卸载Git Extensions并选择OpenSSH而不是

再次安装

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

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

希望对大家有所帮助。

答案 18 :(得分:0)

直接使用Bash添加主机并没有解决问题,使用&#39; Fetch all&#39;在Git扩展中。通过使用&#39; Pull&#39;在一个分支上,Git Extensions通过Bash弹出屏幕自动添加了所需的主机。在这样做之后,我能够使用“全部取出”。再次。不确定Git Extensions做了什么不同。

答案 19 :(得分:0)

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