2017-08-01 210 views
1

我試圖連接到遠程主機,並檢查文件是否存在 在這個階段,我想只是連接,但我得到了一個錯誤:SSH握手抱怨缺少主機密鑰

2017/08/01 18:16:39 unable to connect: ssh: handshake failed: ssh: required host key was nil 

我試圖找出他人是否有我的問題,但我無法找到。

我明白,我需要以某種方式檢查knowns_hosts的過程,但我只是無法弄清楚如何...

var hostKey ssh.PublicKey 
    // A public key may be used to authenticate against the remote 
    // server by using an unencrypted PEM-encoded private key file. 
    // 
    // If you have an encrypted private key, the crypto/x509 package 
    // can be used to decrypt it. 
    key, err := ioutil.ReadFile("/home/user/.ssh/id_rsa") 
    if err != nil { 
     log.Fatalf("unable to read private key: %v", err) 
    } 

    // Create the Signer for this private key. 
    signer, err := ssh.ParsePrivateKey(key) 
    if err != nil { 
     log.Fatalf("unable to parse private key: %v", err) 
    } 

    config := &ssh.ClientConfig{ 
     User: "user", 
     Auth: []ssh.AuthMethod{ 
      // Use the PublicKeys method for remote authentication. 
      ssh.PublicKeys(signer), 
     }, 
     HostKeyCallback: ssh.FixedHostKey(hostKey), 
    } 

    // Connect to the remote server and perform the SSH handshake. 
    client, err := ssh.Dial("tcp", "host.com:22", config) 
    if err != nil { 
     log.Fatalf("unable to connect: %v", err) 
    } 
    defer client.Close() 
} 
+1

你hostKey是 ssh.FixedHostKey(hostKey) 我覺得空 hostKey = signer.PublicKey()也許可以幫助。 – bayrinat

+0

@BayRinat有一個進展,現在我得到一個不匹配「2017/08/01 19:15:47無法連接:ssh:handshake failed:ssh:host key mismatch」,而我100%確定我的密鑰是正確,因爲我能夠通過終端 –

回答

3

這裏你正在尋找:

func getHostKey(host string) (ssh.PublicKey, error) { 
    file, err := os.Open(filepath.Join(os.Getenv("HOME"), ".ssh", "known_hosts")) 
    if err != nil { 
     return nil, err 
    } 
    defer file.Close() 

    scanner := bufio.NewScanner(file) 
    var hostKey ssh.PublicKey 
    for scanner.Scan() { 
     fields := strings.Split(scanner.Text(), " ") 
     if len(fields) != 3 { 
      continue 
     } 
     if strings.Contains(fields[0], host) { 
      var err error 
      hostKey, _, _, _, err = ssh.ParseAuthorizedKey(scanner.Bytes()) 
      if err != nil { 
       return nil, errors.New(fmt.Sprintf("error parsing %q: %v", fields[2], err)) 
      } 
      break 
     } 
    } 

    if hostKey == nil { 
     return nil, errors.New(fmt.Sprintf("no hostkey for %s", host)) 
    } 
    return hostKey, nil 
} 

然後將您的hostKey定義行替換爲

hostKey, err := getHostKey("host.com") 
if err != nil { 
    log.Fatal(err) 
} 

有關該主題的更多信息:

+0

SSH相同的密鑰謝謝,現在它拋出一個錯誤,我的主機名沒有主機密鑰 –

+0

我已經刪除了known_hosts文件,並在我的終端上運行一個SSH到服務器和確認指紋 - 所以它是目前我知道主機中唯一的服務器,它仍然抱怨... –

+0

我很新的編碼和去調試可以解釋不同:)我所做的是讀取文件和(我只是爲了確保它包含指紋[而且它確實]),我在scanner中添加了幾個fmt.Println。掃描()打印出字段和len的字段,並發現字段包含fingerp RINT和它的len爲3 –