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

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

編集する

単純な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- >タブAdvanced- >ボタンEnvironment Variables
eckes

1
私はWindowsの人ではありませんが、/c//(おそらくドライブ文字)がまだ残っているので奇妙に感じます%HOMEDRIVE%...自分で値をいじってエコーすることで、時間を節約できるかもしれません。
カスカベル

1
展開HOMEDRIVEHOMEPATH、設定HOMEした値には...
eckes

回答:


54

メッセージは、のホストキーがorigin信頼できるホストファイルに存在しないことを意味します。

これを回避するために、プレーンなSSH接続を開き、SSH originはリモートホストを信頼するかどうかを尋ねます(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

別の方法として、手動でoriginto のキーを追加することもできますが、(セクションAUTHORIZED_KEYS FILE FORMAT)のマニュアルページで説明されているように、ファイル.ssh/known_hostsのフォーマットに従う必要があります。known_hostssshd


4
githubへのプッシュを実行したときに同じメッセージが表示されましたが、githubにsshでき、known_hostsファイルにgithub.comがあります。
Magnus Lindhe

1
この場合、以下の回答を参考にしてください
Nikita Koksharov 2013

3
コマンドラインSSHクライアントの代わりに、同じ目的でWindowsでPuTTYを使用できます。
brianmearns 2014年

1
ホスト名が完全に同じであることを確認してください。たとえば、ローカルにgitをインストールしていて、リモートとして「home.mydomain.com」という名前を使用しているが、puttyを使用してキーを保存し、「localhost」に接続している場合、機能しません。リモートURLのホスト名に正確に接続する必要があります。
Jason Goemaat 2015年

私はサーバーにパテで接続しようとするのを修正しました。git urlがssh://git@example.ex.com:222 / something / shop.gitであるとしましょう。こうしてputtyのホスト名フィールドexample.ex.comとポート222に入力しました。接続は失敗しましたが、fingerが追加されたようです必要な場所に印刷します。ホームディレクトリのknown_hosts-古いキーを削除したときにファイルに影響がなかったため、どこに追加されたかがわかりません
Darius.V

157

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サービスのフィンガープリント(編集してさらに追加してください):


15
これは受け入れられる答えになるはずです。それはまさにエラーメッセージが言及していることです。私の場合、クローンを作成したときにFQDNを使用していましたが、新しいマシンでは短いローカルドメイン名を使用してのみログインしていました。オリジンのホスト名のキーをキャッシュするには、FQDNとしてputtyまたはplinkを介してログインする必要がありました。「git remote -v」を使用して、リモートとして使用されているホスト名をクロスチェックするのに役立ちます。
ピーボディ

3
また、使用しようとしているホストに対してインタラクティブなPuTTYを使用することもできます。たとえば、新しいWindowsマシンで初めてGithubリポジトリのクローンを作成する場合は、PuTTYを使用してホスト「github.com」へのセッションを開き、サーバーの信頼に関するプロンプトを受け入れてから、コマンドラインは動作するはずです。
Jeremy McGee 14

1
plink実行$ set | grep GIT_SSHして確認することで、MSYS gitが使用しようとしていることを確認できますGIT_SSH='C:\Program Files (x86)\PuTTY\plink.exe'
shuckc '18

2
私はPageantにキーを追加してこれを解決し、Puttyでホストに直接アクセスしました。これにより、ホストをキャッシュに追加するように求められます。同じことをしています。
クノッソス2014

1
gitリポジトリがカスタムSSHポートで提供されている場合は、を使用-Pしてポートを選択しますplink.exe example.com -P 2222。私はgithubからクローンを作成できましたが、個人サーバーからはできませんでした。
ヘイ

79

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=

1
「unset GIT_SSH」でうまくいきました。以前は別のサーバー用にPageant / puttyをセットアップしていましたが、Git Bashプロンプトを使用して新しいキーを作成したとき、戻る必要がありました。助けてくれてありがとう。
スーパーミッチ2012年

手順を実行した後、さらに進んだのですが、「入力時に破損したMAC」エラーが発生します...そのエラーを見たことはありますか?
CDスミス

2
gitをインストールするときに、これらの変数を設定しないことを選択できます。それもデフォルトのバリアントです。私もplink統合を選択しましたが、それが私がここにいる理由です)ありがとう。
アントニーハッチキンズ2013年

1
これはWin7でも私にとってはうまくいきました。どうやらgit bashとplinkの設定が私の場合に問題を引き起こしていたようです。
シリル化された2013年

2
unset GIT_SSHgit bashを起動するたびに実行する必要がありますが、かなり退屈です。それを自動化する方法について何か考えはありますか?
ロイック

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質問に答えてリモートホストに正常に接続すると、準備が整います。先に進んで、もう一度プッシュしてみてください。


PLink / Pageantを使用するWindowsでGit Bashを使用するのはこれでした。本当にありがとう!
アムスロス2013

1
Stash(現在のBitbucket)リポジトリを使用して、私は使用しなければなりませんでした"$GIT_SSH" -P 7999 git@stash.domain.local
Julien

4

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

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


ssh/known_hosts%USERPROFILE%Win7でこの問題が発生し、解決策はありません...
Frank Nocke 2012

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

そして、レジストリにインポートすることを選択します。keyscanはドメインの公開鍵を取得し(bitbucketで問題が発生しました)、PythonスクリプトがそれをPlink形式に変換します。


2

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


また、ホストを指定するまったく同じ方法を使用します。たとえば、sshの場合はgitserver.example.com、gitの場合はgitserverではありません。
Matthijs P 2014

2

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


2

作業環境:

  • ウインドウズ10
  • ギット
  • パテ

まず、Regeditに従って、レジでputty known_hostsを削除します。
次に%GIT_SSH% user@hostname、ウィンドウのcmdでコマンドを実行すると、問題が解決します。

皆さんのお役に立てば幸いです。


1

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

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


ページェントの問題が発生すると、他のエラーメッセージが表示されます。ではありませんConnection abandonedが、次のようなものですAccess denied (private key)
Andrey Regentov

1

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


ATLASSIAN SOURCETREEを使用してgitプッシュ/プル操作を実行しているときに、認識されないホストキーに関するメッセージを受け取った場合、y / nに応答することができず、キーをキャッシュせずにプッシュ/プル操作が中止されます。ただし、SourceTree Tools-> Options(General Tab)に移動し、SSH Clientを(SSH Client Configurationの下で)PuTTYからOpenSSHに変更すると、他に何も変更せずにキーをキャッシュできます。
Rod Dewell

1

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

組み込みGitに切り替え、押して[はい]ボタンを押し、システム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

で答えたようローマンStarkovplinkそれのキャッシュにホストを追加する必要があります。

Git Extensionsを使用している場合:

  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を使用してください!


0

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


0

上記の方法をすべて試しましたが、私のラップトップで同じ問題を解決できる方法はありませんでした。最後に、ブランチをgit bashでoriginにプッシュする代わりに、TortoiseGitのpushオプションを使用してプッシュを実行し、次にウィンドウがポップアップして、新しいホストキーをキャッシュに追加するように要求します。yesボタンをクリックすると、すべてが実行されます元気です。

皆さんのお役に立てば幸いです。


0

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

「y」を押してからCtrl + Cをputty.exe押しました。Openedを実行すると、古いキーが追加されてgitに返され、ファイルがプッシュされました。


0

Git Extensionsをアンインストールして、代わりにOpenSSHを選択して再インストールするだけです


0

Windows 7または10でうまく機能したのは、GIT_SSHシステム変数を削除することです。以前はPlinkを使用するように設定されていましたが、現在はPuttyに置き換えられています。これがPlink.exeエラーの原因でした

PCが64ビットOSだったため、Git(32ビットバージョン)の古いインストールとGitへの更新(例:Git-2.20.1-64-bit.exe)もありました。

とにかく、GitインストールではデフォルトでOpen SSHを使用するため、Putty / PlinkはGitでも使用されませんでした。


0

ATLASSIAN SOURCETREEを使用してgitプッシュ/プル操作を実行しているときに、認識されないホストキーに関するメッセージを受け取った場合、y / nに応答することができず、キーをキャッシュせずにプッシュ/プル操作が中止されます。ただし、SourceTree Tools-> Options(General Tab)に移動し、SSH Clientを(SSH Client Configurationの下で)PuTTYからOpenSSHに変更すると、他に何も変更せずにキーをキャッシュできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.