git - Sunucu ana bilgisayar anahtarı önbelleğe alınmamış


101

Yerel depomdaki değişiklikleri uzak depoya aktarmaya çalışıyorum. Yazdığımda:

git push origin

Şu hatayı alıyorum:

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

Bunu Nasıl Çözebilirim? Windows 7'de komut satırından git kullanıyorum.

Düzenle

Basit bir ssh yapmaya çalıştığımda

ssh user@hostname

Şu hatayı alıyorum:

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

Yol geçersiz olduğu için bir şekilde dizini yaratmayacak. Bunu nasıl düzeltebilirim?

@eckes: EDIT2

Evim olarak ayarlandı %HOMEDRIVE%%HOMEPATH%bu doğru mu?


2
$HOMEDoğru kurulmamış gibi görünüyor . Ayarlamak için deneyin HOMEkullanarak pencerelerde ortam değişkeni My Computer-> sağ tık -> Properties-> Sekme Advanced-> DüğmeEnvironment Variables
Eckes

1
Ben bir windows adamı değilim, ama /c//(muhtemelen bir sürücü harfinden) sonra hala sahip olduğun için bana garip geliyor %HOMEDRIVE%... Kendin değerle uğraşıp onu tekrarlayarak biraz zaman kazanabilir misin?
Cascabel

1
Expand HOMEDRIVEve HOMEPATHve set HOMEçıkan değere ...
Eckes

Yanıtlar:


54

Mesaj, ana bilgisayar anahtarının origingüvenilir ana bilgisayar dosyanızda bulunmadığı anlamına gelir .

Bunu aşmak için, düz bir SSH bağlantısı açın originve SSH size uzak ana bilgisayara güvenmek isteyip istemediğinizi soracaktır (Git konsolundan):

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

Uzak ana bilgisayara güveniyorsanız (yani tür yes), SSH anahtarını bilinen ana bilgisayarlar listesine ekleyecektir.

Bundan sonra, yapabilmelisin git push origin.

Alternatif olarak, el ile de anahtarını ekleyebilirsiniz originetmek .ssh/known_hostsama bu biçimi uymasını gerektirmektedir known_hostsadamı sayfasında açıklanan şekilde dosyaya sshd(Bölüm authorized_keys dosyası FORMAT ).


4
Github'a push yaparken aynı mesajı aldım ama github'a ssh yapabilirim ve dosyamda github.com var known_hosts.
Magnus Lindhe

1
Bu durumda aşağıdaki cevaba bakın
Nikita Koksharov

3
PuTTY'yi bir komut satırı SSH istemcisi yerine pencerelerde aynı amaçlarla kullanabilirsiniz.
brianmearns

1
Ana bilgisayar adlarının tamamen aynı olduğundan emin olun. Örneğin, git'i yerel olarak yüklediyseniz ve uzaktan kumanda olarak 'home.mydomain.com' adını kullanıyorsanız, ancak anahtarı 'localhost'a bağlanmak için macun kullanarak saklayın, bu işe yaramaz. Uzak url'nizdeki tam olarak ana bilgisayar adına bağlanmanız gerekir.
Jason Goemaat

Benim için macun ile sunucuya bağlanmaya çalışmak düzeltildi. Git url'nin ssh: //git@example.ex.com: 222 / something / shop.git olduğunu söyleyelim, bu yüzden macun Ana bilgisayar adı alanına example.ex.com ve 222 numaralı bağlantı noktasına girdim. Sonra bağlantı başarısız oldu ama sanırım parmak ekledi gerektiği yerde yazdırın. Nereye eklendiğini anlamıyorum çünkü ana
dizinimde bilinen_hosts

157

Standart komut istemi aracılığıyla PuTTY kullanarak Windows'ta MSYS Git kuranlar için PuTTY'nin önbelleğine bir ana bilgisayar eklemenin yolu çalıştırmaktır.

> plink.exe <host>

Örneğin:

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

Sadece cevap y ve gerisini Ctrl + C'ye bırakın.

Yine de parmak izini kontrol edin. Bu uyarı iyi bir sebepten dolayı var. Bazı git hizmetleri için parmak izleri (daha fazlasını eklemek için lütfen düzenleyin):


15
Kabul edilen cevap bu olmalıdır. Hata mesajının kastettiği şey tam olarak budur. Benim durumumda klonladığımda bir FQDN kullandım, ancak yeni makinemde yalnızca kısa yerel alan adını kullanarak oturum açmıştım. Köken üzerindeki ana bilgisayar adının anahtarını önbelleğe almak için FQDN olarak macun veya plink ile oturum açmak zorunda kaldım. Uzaktan kumanda olarak kullanılan ana bilgisayar adını "git remote -v" kullanarak çapraz kontrol etmeye yardımcı olabilir.
peabody

3
Ayrıca kullanmaya çalıştığınız ana bilgisayarda etkileşimli PuTTY kullanmak için çalışır. Örneğin, yeni bir Windows makinesinde bir Github deposunu ilk kez klonlamaya çalışıyorsanız, 'github.com' ana bilgisayarına bir oturum açmak için PuTTY'yi kullanın, sunucu güveniyle ilgili uyarıyı kabul edin ve ardından komut satırı çalışmalıdır.
Jeremy McGee

1
Sen MSYS'i git kullanımına attemtping söyleyebilirim plinkçalıştırarak $ set | grep GIT_SSHve kontrolGIT_SSH='C:\Program Files (x86)\PuTTY\plink.exe'
shuckc

2
Bunu, Anahtarımı Pageant'a ekleyerek ve ana bilgisayara Putty ile doğrudan erişerek çözdüm. Bu, ana bilgisayarı önbelleğe eklemenizi ister. Aynı şeyi yapmak.
Knossos

1
Senin git depo özel SSH bağlantı yayınlanırsa, kullanmak -Pgibi bağlantı noktasını seçmek için: plink.exe example.com -P 2222. Github'dan klonlayabildim ama kişisel sunucumdan klonlayamadım ve bu beni sonsuza kadar karıştırdı.
Hay

79

Git Bash isteminden "set | grep -i ssh" yapmayı deneyin

Kurulumunuz benimki gibiyse, muhtemelen şu ayarlara sahipsiniz:

GIT_SSH='C:\Program Files (x86)\PuTTY\plink.exe'
PLINK_PROTOCOL=ssh
SVN_SSH='"C:\\Program Files (x86)\\PuTTY\\plink.exe"'

yaptım

unset GIT_SSH
unset PLINK_PROTOCOL
unset GIT_SVN

ve bundan sonra çalıştı, .. sanırım macun anahtarlarını başka bir yere $ HOME / .ssh veya başka bir şey olarak kaydediyor ... (Ayrıca $ HOME'un "C: \ Kullanıcılar \" olarak ayarlandığı bir kutuda da bir sorun yaşadım usrnam "/ C / Users / usrnam /" yerine "

neyse, kilometreniz değişebilir ama bu benim için sorunu çözdü. :-)

(muhtemelen sadece ayarlanmayan GIT_SSH yeterliydi, ama ben çok iyiydim)

Not: Ayarlanmamışsa, şunu deneyin:

set GIT_SSH=

1
"unset GIT_SSH" benim için çalıştı. Daha önce farklı bir sunucu için Pageant / putty kurmuştum, ancak Git Bash komut istemini kullanarak yeni anahtarlar oluşturduğumda geri dönmem gerekiyordu. Yardım için teşekkürler.
supermitch

Adımlarınızı attıktan sonra daha da ileri gittim ama şimdi "girişte kesintili mac" hatası alıyorum ... bunu hiç gördünüz mü?
CD Smith

2
Git'i kurarken bu değişkenleri AYARLAMAMAYI tercih edebilirsiniz. Hatta varsayılan değişkendir. Plink entegrasyonunu da seçmeme rağmen, bu yüzden buradayım) Teşekkürler.
Antony Hatchkins

1
Bu benim için Win7'de de çalıştı. Görünüşe göre git bash'ın plink ile kurulumu benim durumumda soruna neden oluyordu.
nhylated

2
unset GIT_SSHbenim için de çalıştı, ancak oldukça sıkıcı olan git bash'ı her başlattığımda yapmak zorunda kaldım. Bunun nasıl otomatikleştirileceğine dair bir fikriniz var mı?
Loïc

19

GIT_SSHOrtam değişkeninizin ayarlandığından şüpheleniyorum %ProgramFiles(x86)%\putty\plink.exe. Bazı nedenlerden dolayı PLink .ssh/known_hosts, uzak ana bilgisayar anahtarlarını saklamak için kullanıcı dizininizdeki dosyayı kullanmaz .

Bu aslında sizin durumunuzsa ve eğer yarışmayı kullanmak istiyorsanız kasıtlı olabilir, önce ev sahibine bağlanmak için PLink kullanmanız gerekir.

"$GIT_SSH" user@hostname

Benzer bir mesaj almalısın

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)

Eğer cevapladıktan sonra ysoruya başarıyla uzak ana bağlı hazırsınız olmalıdır. Devam edin ve tekrar itmeyi deneyin.


PLink / Pageant ile pencerelerde Git Bash'i kullanmak benim için buydu. Çok teşekkürler!
amsross

1
Bir Stash (şimdi Bitbucket) deposu kullanarak kullanmak zorunda kaldım"$GIT_SSH" -P 7999 git@stash.domain.local
Julien

4

En azından Windows'ta ana bilgisayara ssh'lamak yeterli değil. Bu, ana bilgisayar anahtarınıssh/known_hosts ancak hata hala devam eder.

Git bash penceresini kapatmanız ve yeni bir tane açmanız gerekiyor. Ardından kayıt defteri önbelleği temizlenir ve itme / çekme işlemi çalışır.


ssh/known_hostsneye göreceli ?,% USERPROFILE% Bu sorunu Win 7'de yaşıyorum ve çözüm yok ...
Frank Nocke

2

Rene, HOMEdeğişkeniniz doğru ayarlanmamış. Ya değiştirin c:\Users\(your-username)ya da değiştirin %USERNAME%.


2

Plink ile Çözüm

Kaydet bu python komut için 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 ve Python 2.7'de test edilmiştir .

O zaman koş:

ssh-keyscan -t rsa bitbucket.org >>~/.ssh/known_hosts
python --win known_hosts.py >known_hosts.reg
start known_hosts.reg

Ve kayıt defterine aktarmayı seçin. Keyscan, etki alanı için genel anahtarı alacak (bitbucket ile sorunlarım oldu) ve ardından python betiği onu Plink formatına dönüştürecektir.


2

Aynı sorunu yaşadım ve yalnızca genel SSH bağlantı noktasının değil , tüm havuzun bulunduğu bağlantı noktasındaki SSH'ye bağlanmayı unuttuğunuzda ana bilgisayar anahtarı farklıdır!


Ayrıca, ana bilgisayarı belirtmek için tam olarak aynı yolu kullanın, örneğin ssh için gitserver.example.com ve git için gitserver kullanmayın.
Matthijs P

2

Putty'yi açın ve kodunuzu iletmek istediğiniz uzak sunucuya bağlantı kurmaya çalışın. diyalog göründüğünde Evet'e basın (uzaktan kumandaya güvenirsiniz), her şey yoluna girecektir.


2

Çalışma ortamı:

  • Windows 10
  • git
  • macun

Birincisi: Regedit'e göre kayıttaki bilinen macun ana makinelerini silin.
Ardından: Komutun %GIT_SSH% user@hostnameWindows cmd'sinde yürütülmesi sorunu çözer.

Umarım hepinize yardımcı olur.


1

Windows 7 makinemde bir depoyu klonlamaya çalışırken ben de aynı sorunu yaşadım. Burada bahsedilen cevapların çoğunu denedim. Hiçbiri benim için çalışmadı.

Benim için işe yarayan şey, Pageant (Putty kimlik doğrulama aracı) programını çalıştırmaktı. Pageant arka planda çalıştıktan sonra, klonlayabildim, depodan / depoya itip çekebildim. Bu benim için işe yaradı, çünkü ilk kez kullanıldığında bir parola gerekli olacak ve Yarışma başlayacak şekilde genel anahtarımı kurmuş olmam olabilir.


Yarışmada sorun olduğunda başka bir hata mesajı alırsınız. Değil Connection abandoned, ama bunun gibi bir şeyAccess denied (private key)
Andrey Regentov

1

PuTTY'den OpenSSH'ye geçmek, GIT_SSH'yi, vb. Ayarlamaya gerek kalmadan benim için bu sorunu çözdü.


ATLASSIAN SOURCETREE'yi kullanarak git itme / çekme işlemlerini yaparken tanınmayan ana bilgisayar anahtarı hakkında bir mesaj alırsanız, y / n'yi yanıtlayamazsınız ve anahtar önbelleğe alınmadan itme / çekme işlemi iptal edilir. Ancak SourceTree Araçları-> Seçenekler'e (Genel Sekme) gidip (SSH İstemci Yapılandırması altında) altında SSH İstemcisini PuTTY'den OpenSSH'ye değiştirmek, anahtarın başka hiçbir şeyi değiştirmeden önbelleğe alınmasına izin verecektir.
Rod Dewell

1

Bu geçici çözümü kullanarak benzer sorunu çözdüm .

Sadece Gömülü Git'e geçmeniz, düğmesine basmanız, Evet düğmesine basmanız ve ardından Sistem Git'e geri dönmeniz yeterlidir.

Bu seçeneği şurada bulabilirsiniz:

Tools -> Options -> Git

1
Şimdi v2.5.5.0 konumunda:C:\Users\{UserName}\AppData\Local\SourceTree\app-2.5.5\tools\putty> .\plink.exe {YourNewHost}
John_J

1

Roman Starkov'un yanıtladığı gibi ,plink 's cache ev sahipliği eklemesi gerekir.

Git Uzantılarını kullanan kişiler için :

  1. Git Uzantılarını Aç
  2. Araçlar -> Ayarlar -> SSH'ye gidin
  3. Yolu "plink.exe" (PuTTY kullanılıyorsa) / "klink.exe" (KiTTY kullanılıyorsa) kopyalayın
  4. Bir konsolda aşağıdaki komutu çalıştırın:

(gerçek yollarla değiştirin)

<the path to plink/klink.exe> <address to the server>

Örneğin

%ProgramData%\chocolatey\lib\kitty\tools\klink.exe codebasehq.com

Not : Git Extensions'ın kullandığı plink / klink'in aynısını kullandığınızdan emin olun!


0

Ana bilgisayarı doğrudan Bash ile eklemek sorunu çözmedi, hata Git Uzantılarında 'Tümünü getir' kullanılırken oluşmaya devam ediyordu. Bir dalda 'Çek' kullanılarak, gerekli ana bilgisayar bir Bash açılır ekranıyla Git Uzantıları tarafından otomatik olarak eklendi. Bunu yaptıktan sonra 'Tümünü Getir'i tekrar kullanabildim. Git Uzantıları tarafından farklı şekilde ne yapıldığından emin değilim.


0

Yukarıdaki tüm yöntemleri denedim ama hiçbiri dizüstü bilgisayarımda aynı sorunu çözemedi. Son olarak, git bash'da dalı başlangıç ​​noktasına itmek yerine, itme işlemini yapmak için TortoiseGit'in itme seçeneğini kullanmaya başladım, ardından evet düğmesine tıkladıktan sonra önbelleğe yeni ana bilgisayar anahtarını eklememi isteyen bir pencere açıldı, her şey gider Şimdi iyi.

Umarım hepinize yardımcı olur.


0

Bir sabit diski değiştirdim, Windows kurdum. Dosyaları yüklemeye çalıştığınızda bu komut penceresi alındı.

"Y" ye, ardından Ctrl + C'ye bastım. Açıldı putty.exe, eski bir anahtar ekledim ve git'e geri döndüm ve dosyaları ittim.


0

Git Extensions'ı kaldırın ve bunun yerine OpenSSH'yi seçerek tekrar yükleyin.


0

Windows 7 veya 10'da, benim için işe yarayan numara GIT_SSH sistem değişkenini silmektir. Plink'i kullanmadan önce ayarlanmıştı ve şimdi Putty ile değiştirildi. Bu Plink.exe hatasına neden oluyordu

Ayrıca, PC 64-bit işletim sistemi olduğundan, Git'in eski bir kurulumu (32-bit sürümü) ve Git'e güncelleme (örneğin Git-2.20.1-64-bit.exe) vardı.

Her neyse, Putty / Plink Git kurulumunda varsayılan olarak Açık SSH kullanılması gerektiğinden Git tarafından kullanılmıyordu.


0

ATLASSIAN SOURCETREE'yi kullanarak git itme / çekme işlemlerini yaparken tanınmayan ana bilgisayar anahtarı hakkında bir mesaj alırsanız, y / n'yi yanıtlama yeteneğiniz yoktur ve anahtar önbelleğe alınmadan itme / çekme işlemi iptal edilir. Ancak SourceTree Araçları-> Seçenekler'e (Genel Sekme) gidip (SSH İstemci Yapılandırması altında) altında SSH İstemcisini PuTTY'den OpenSSH'ye değiştirmek, anahtarın başka hiçbir şeyi değiştirmeden önbelleğe alınmasına izin verecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.