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 ComputerPropertiesAdvancedEnvironment Variables
eckes

1
나는 윈도우즈 녀석은 아니지만, /c//(아마도 드라이브 문자) 당신이 여전히 가지고 있다는 사실이 이상하게 느껴진다 %HOMEDRIVE%... 당신은 스스로 가치를 만지작 거리고 그것을 반향함으로써 시간을 절약 할 수 있을까?
Cascabel

1
확장 HOMEDRIVE하고 결과 값으로 HOMEPATH설정 HOME합니다 ...
eckes

답변:


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)?

원격 호스트를 신뢰하는 경우 (예 : 유형 yes) SSH는 알려진 호스트 목록에 해당 키를 추가합니다.

그 후에 git push origin.

다른 방법으로, 당신은 또한 수동의 주요 추가 할 수 있습니다 origin에를 .ssh/known_hosts하지만 당신이 형식을 준수해야합니다 known_hosts의 매뉴얼 페이지에 설명 된대로 파일 sshd(섹션 의 authorized_keys 파일 형식 ).


4
github에 푸시 할 때 동일한 메시지를 받았지만 github에 ssh 할 수 있으며 known_hosts파일에 github.com이 있습니다.
Magnus Lindhe 2011

1
이 경우 아래의 답을보세요
니키타 Koksharov에게

3
명령 줄 SSH 클라이언트 대신 Windows에서 동일한 목적으로 PuTTY를 사용할 수 있습니다.
brianmearns 2014 년

1
호스트 이름이 정확히 동일한 지 확인하십시오. 예를 들어 git이 로컬에 설치되어 있고 'home.mydomain.com'이라는 이름을 리모컨으로 사용하지만 putty를 사용하여 키를 저장하여 'localhost'에 연결하면 작동하지 않습니다. 원격 URL의 호스트 이름에 정확히 연결해야합니다.
Jason Goemaat

나를 위해 퍼티를 서버에 연결하려고 수정했습니다. git url이 ssh : //git@example.ex.com : 222 / something / shop.git라고 가정 해 보겠습니다. 그래서 putty 호스트 이름 필드 example.ex.com과 포트 222에 입력했습니다. 연결이 실패했지만 손가락이 추가 된 것 같습니다. 필요한 곳에 인쇄하십시오. 내 홈 디렉토리에서 known_hosts-파일이 이전 키를 삭제했을 때 영향을받지 않았기 때문에 추가 된 위치를 이해하지 못합니다
Darius.V

157

표준 명령 프롬프트를 통해 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 서비스에 대한 지문 (추가하려면 편집하십시오) :


15
이것은 받아 들여진 대답이어야합니다. 오류 메시지가 나타내는 내용입니다. 필자의 경우 복제 할 때 FQDN을 사용했지만 새 컴퓨터에서는 짧은 로컬 도메인 이름 만 사용하여 로그인했습니다. 오리진의 호스트 이름에 대한 키를 캐시하려면 putty 또는 plink를 통해 FQDN으로 로그인해야했습니다. "git remote -v"를 사용하여 원격으로 사용되는 호스트 이름을 교차 확인하는 데 도움이 될 수 있습니다.
peabody

3
또한 사용하려는 호스트에 대화 형 PuTTY를 사용하도록 작동합니다. 예를 들어, 새로운 Windows 시스템에서 처음으로 Github 저장소를 복제하려는 경우 PuTTY를 사용하여 호스트 'github.com'에 대한 세션을 열고 서버 신뢰에 대한 프롬프트를 수락 한 다음 명령 줄이 작동합니다.
Jeremy McGee

1
plink실행 $ set | grep GIT_SSH하고 확인 하여 MSYS git이 사용 을 시도하고 있음을 알 수 있습니다.GIT_SSH='C:\Program Files (x86)\PuTTY\plink.exe'
shuckc

2
Pageant에 내 키를 추가하고 Putty로 호스트에 직접 액세스하여이 문제를 해결했습니다. 그러면 캐시에 호스트를 추가하라는 메시지가 표시됩니다. 같은 일을합니다.
Knossos

1
git 저장소가 사용자 지정 SSH 포트에서 제공되는 경우을 사용 -P하여 다음과 같은 포트를 선택합니다 plink.exe example.com -P 2222. github에서 복제 할 수 있었지만 개인 서버에서는 복제 할 수 없었기 때문에 끝까지 혼란 스러웠습니다.
Hay

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

그 후에 작동했습니다 .. 퍼티가 다른 곳에 키를 $ HOME / .ssh 등으로 저장하는 것 같습니다 ... ($ HOME이 "C : \ Users \"로 설정된 상자에서도 문제가 발생했습니다. "/ C / Users / usrnam /"대신 usrnam "

어쨌든 귀하의 마일리지는 다를 수 있지만 그로 인해 해결되었습니다. :-)

(아마 설정되지 않은 GIT_SSH를 수행하는 것으로 충분하지만 나는 롤에있었습니다)

참고 : 설정 해제가 작동하지 않으면 다음을 시도하십시오.

set GIT_SSH=

1
"unset GIT_SSH"가 저에게 효과적이었습니다. 이전에 다른 서버에 대해 Pageant / putty를 설정했지만 Git Bash 프롬프트를 사용하여 새 키를 만들 때 돌아 가야했습니다. 도와 주셔서 감사합니다.
supermitch

단계를 수행 한 후 더 나아 갔지만 이제 "입력시 맥이 커졌습니다"오류가 발생합니다.이 오류를 본 적이 있습니까?
CD Smith

2
git을 설치할 때 해당 변수를 설정하지 않도록 선택할 수 있습니다. 기본 변형이기도합니다. 나는 plink 통합도 선택했지만 이것이 내가 여기있는 이유이다) 감사합니다.
안토니 Hatchkins

1
이것은 Win7에서도 저에게 효과적이었습니다. 분명히 git bash의 plink 설정이 제 경우 문제를 일으켰습니다.
nhylated

2
unset GIT_SSH나를 위해 일했지만 매번 git bash를 시작할 때마다해야하지만 꽤 지루합니다. 자동화하는 방법에 대한 아이디어가 있습니까?
Loïc

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를 사용하는 나를위한 것입니다. 정말 고마워!
amsross 2013-08-22

1
Stash (현재 Bitbucket) 저장소를 사용하여"$GIT_SSH" -P 7999 git@stash.domain.local
Julien

4

적어도 Windows에서는 호스트에 대한 ssh'ing만으로는 충분하지 않습니다. 그러면 호스트 키가 추가 ssh/known_hosts되지만 오류는 계속 발생합니다.

git bash 창을 닫고 새 창을 열어야합니다. 그런 다음 레지스트리 캐시가 지워지고 푸시 / 풀이 작동합니다.


ssh/known_hosts무엇과 관련이 있습니까?, % USERPROFILE % Win 7에서이 문제가 발생하며 해결책이 없습니다 ...
Frank Nocke

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

그리고 레지스트리로 가져 오도록 선택하십시오. 키 캔은 도메인에 대한 공개 키를 검색하고 (bitbucket에 문제가 있음) Python 스크립트가이를 Plink 형식으로 변환합니다.


2

같은 문제가 있었고 일반 SSH 포트가 아닌 actuall repository포트에서 SSH에 연결하는 것을 잊으 셨으면 호스트 키가 다릅니다!


또한 ssh의 경우 gitserver.example.com, git의 경우 gitserver가 아닌 호스트를 지정하는 것과 똑같은 방법을 사용하십시오.
Matthijs P 2014

2

Putty를 열고 코드를 푸시하려는 원격 서버에 연결을 시도하십시오. 대화 상자가 나타나면 예 (원격을 신뢰 함)를 누르면 모든 것이 정상입니다.


2

근무 환경:

  • 윈도우 10
  • 자식
  • 퍼티

첫째 : Regedit에 따라 registy에서 putty known_hosts를 삭제합니다.
그런 다음%GIT_SSH% user@hostname Windows의 cmd에서 명령 을 실행 하면 문제가 해결됩니다.

모두에게 도움이되기를 바랍니다.


1

Windows 7 컴퓨터에서 저장소를 복제하려고 할 때도 동일한 문제가 발생했습니다. 여기에 언급 된 대부분의 답변을 시도했습니다. 그들 중 누구도 나를 위해 일하지 않았습니다.

나를 위해 일한 것은 Pageant (Putty 인증 에이전트) 프로그램을 실행하는 것이 었습니다 . Pageant가 백그라운드에서 실행되면 저장소에서 복제, 푸시 및 풀 수있었습니다. 이것은 나를 위해 일했습니다. 처음으로 사용할 때마다 암호가 필요하고 Pageant가 시작되도록 공개 키를 설정했기 때문일 수 있습니다.


미인 대회 문제인 경우 다른 오류 메시지가 표시됩니다. 아니 Connection abandoned,하지만 뭔가Access denied (private key)
Andrey Regentov 2015-04-03

1

PuTTY에서 OpenSSH로 변경하면 GIT_SSH 등을 설정 해제 할 필요없이이 문제가 해결되었습니다.


ATLASSIAN SOURCETREE를 사용하여 git push / pull 작업을 수행하는 동안 인식 할 수없는 호스트 키에 대한 메시지를 받으면 y / n에 응답 할 수 없으며 키를 캐싱하지 않고 push / pull 작업이 중단됩니다. 그러나 SourceTree 도구-> 옵션 (일반 탭)으로 이동하여 SSH 클라이언트 구성 아래의 SSH 클라이언트를 PuTTY에서 OpenSSH로 변경하면 다른 항목을 변경하지 않고 키를 캐시 할 수 있습니다.
Rod Dewell

1

해결 방법을 사용하여 비슷한 문제를 해결했습니다 .

Embedded Git으로 전환하고, Yes 버튼을 누른 다음 System 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

응답으로 로마 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를 사용해야합니다!


0

Bash로 호스트를 직접 추가해도 문제가 해결되지 않았으며 Git Extensions에서 '모두 가져 오기'를 사용할 때 오류가 계속 발생했습니다. 한 브랜치에서 'Pull'을 사용하여 Bash 팝업 화면과 함께 Git Extensions에 의해 필요한 호스트가 자동으로 추가되었습니다. 이렇게하면 다시 '모두 가져 오기'를 사용할 수 있습니다. Git Extensions가 다르게 수행하는 작업이 확실하지 않습니다.


0

위의 모든 방법을 시도했지만 어느 것도 내 노트북에서 동일한 문제를 해결할 수 없었습니다. 마지막으로 git bash에서 브랜치를 원점으로 푸시하는 대신 TortoiseGit의 푸시 옵션을 사용하여 푸시를 수행 한 다음 새 호스트 키를 캐시에 추가하도록 요청하는 창이 팝업되고 예 버튼을 클릭하면 모든 작업이 진행됩니다. 이제 괜찮아.

여러분 모두에게 도움이되기를 바랍니다.


0

하드 디스크를 변경하고 Windows를 설치했습니다. 파일 업로드를 시도 할 때이 명령 창이 수신되었습니다.

나는 "y"를 누른 다음 Ctrl + C를 눌렀다. Opened putty.exe는 이전 키를 추가하고 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)로 업데이트되었습니다.

어쨌든 Putty / Plink는 Git 설치에서 Open SSH를 사용하는 것이 기본이기 때문에 Git에서 사용하지 않았습니다.


0

ATLASSIAN SOURCETREE를 사용하여 git push / pull 작업을 수행하는 동안 인식 할 수없는 호스트 키에 대한 메시지를 받으면 y / n에 응답 할 수 없으며 키를 캐싱하지 않고 push / pull 작업이 중단됩니다. 그러나 SourceTree 도구-> 옵션 (일반 탭)으로 이동하여 SSH 클라이언트 구성 아래의 SSH 클라이언트를 PuTTY에서 OpenSSH로 변경하면 다른 변경없이 키를 캐시 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.