web-dev-qa-db-ja.com

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

どうすれば解決できますか? Windows 7のコマンドラインからgitを使用しています。

編集

シンプルなsshをしようとすると

ssh [email protected]

次のエラーが表示されます。

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

パスが無効であるため、どういうわけかディレクトリが作成されません。これを修正する方法は?

@eckes:Edit2

私のホームは%HOMEDRIVE%%HOMEPATH%に設定されていますこれは正しいですか?

98
Rene Terstegen

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サービスの指紋(さらに追加するには編集してください):

151
Roman Starkov

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\「/ C/Users/usrnam /」ではなく「usrnam」

とにかく、あなたの走行距離は異なるかもしれませんが、それは私のためにそれを修正しました。 :-)

(おそらく、未設定のGIT_SSHを実行するだけで十分ですが、私はロールバックしていました)

注:unsetが機能しない場合は、これを試してください:

set GIT_SSH=
78
Thijs

GIT_SSH環境変数が%ProgramFiles(x86)%\PuTTY\plink.exeに設定されていると思われます。何らかの理由で、PLinkはユーザーディレクトリの.ssh/known_hostsファイルを使用してリモートホストキーを保存しません。

これが実際にあなたのケースであり、ページェントを使用したい場合は意図的にそうであるかもしれない場合、最初にホストに接続するためにPLinkを使用する必要があります。

"$GIT_SSH" [email protected]

同様のメッセージが表示されるはずです

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と回答し、リモートホストに正常に接続したら、設定は完了です。さあ、もう一度プッシュを試してください。

18
Gunee

少なくともWindowsでは、ホストにsshするだけでは不十分です。ホストキーがssh/known_hostsに追加されますが、エラーは引き続き発生します。

Git bashウィンドウを閉じて、新しいウィンドウを開く必要があります。その後、レジストリキャッシュがクリアされ、プッシュ/プルが機能します。

4
andynormancx

同じ問題があり、実際のリポジトリがあるポートでSSHに接続するを忘れて、一般的なSSHポートだけではなく、ホストキーが異なります!

2
Mateusz

ルネ、HOME変数が正しく設定されていません。 c:\Users\(your-username)に変更するか、単に%USERNAME%に変更してください。

2
rezsa f

作業環境:

  • ウインドウズ10
  • git
  • パテ

最初: Regeditに従ってRegTyでPuTTY known_hostsを削除します。
Then: Windowのcmdでコマンド%GIT_SSH% [email protected]を実行すると問題が解決します。

それがあなたのすべてに役立つことを願っています。

2
Jason 徐

Windows 7マシンでリポジトリをクローンしようとしたときにも、同じ問題が発生しました。ここで述べた答えのほとんどを試しました。それらのどれも私のために働いた。

私にとってうまくいったのは、Pageant(PuTTY認証エージェント)プログラムを実行することでした。 Pageantがバックグラウンドで実行されると、リポジトリからクローンを作成、プッシュ、プルすることができました。これは私にとってはうまくいきました。パスワードを最初に使用するたびにパスワードが必要になり、Pageantが起動するように公開キーを設定したからかもしれません。

1
sunilkumarba

これを使用して同様の問題を解決しました 回避策

組み込みGitに切り替えてプッシュし、[はい]ボタンを押してから、システムGitに戻すだけです。

このオプションは

Tools -> Options -> Git
1
Pyro

PuTTYを開いて、コードをプッシュするリモートサーバーへの接続を確立するだけです。ダイアログが表示されたら、[はい]を押します(リモートを信頼します)。

1
sadegh saati

Plinkを使用したソリューション

保存 this python script to 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: '[email protected]: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形式に変換します。

1
Henrik

PuTTYからOpenSSHに変更すると、GIT_SSHなどを設定解除する必要なく、この問題が修正されました。

0
79E09796

Git Extensionsをアンインストールしてから、OpenSSHを選択して再度インストールするだけです

0
Kiran.vanam

ホストを直接Bashで追加しても問題は解決しませんでした。Git拡張機能で「すべて取得」を使用すると、エラーが引き続き発生しました。 1つのブランチで「プル」を使用すると、必要なホストがGash Extensionsによって自動的に追加され、Bashポップアップ画面が表示されます。これを実行した後、「すべて取得」を再び使用することができました。 Git Extensionsによって何が異なるかはわかりません。

0
Bart VdA

ハードディスクを交換し、Windowsをインストールしました。このコマンドウィンドウを受け取ったファイルをアップロードしようとしたとき。

「y」、次にCtrl + Cを押しました。PuTTY.exeを開き、gitに戻る古いキーを追加して、ファイルをプッシュしました。

0
CoolMind

上記のすべての方法を試しましたが、どれも私のラップトップで同じ問題を解決できませんでした。最後に、git bashでOriginにブランチをプッシュする代わりに、TortoiseGitのプッシュオプションを使用してプッシュを実行し、ウィンドウがポップアップして、キャッシュに新しいホストキーを追加するように求められます。今は大丈夫。

それが皆さんの役に立つことを願っています。

0
Allen Jin