您需要使用ssh.PublicKeys
將ssh.Signers
的列表變成ssh.AuthMethod
。您可以使用ssh.ParsePrivateKey
從pem字節中獲得Signer
,或者如果您需要使用rsa,dsa或ecdsa私鑰,則可以將它們授予ssh.NewSignerFromKey
。
下面的例子充實了Agent支持(因爲使用代理通常是簡單地使用密鑰文件之後的下一步)。
sock, err := net.Dial("unix", os.Getenv("SSH_AUTH_SOCK"))
if err != nil {
log.Fatal(err)
}
agent := agent.NewClient(sock)
signers, err := agent.Signers()
if err != nil {
log.Fatal(err)
}
// or get the signer from your private key file directly
// signer, err := ssh.ParsePrivateKey(pemBytes)
// if err != nil {
// log.Fatal(err)
// }
auths := []ssh.AuthMethod{ssh.PublicKeys(signers...)}
cfg := &ssh.ClientConfig{
User: "username",
Auth: auths,
}
cfg.SetDefaults()
client, err := ssh.Dial("tcp", "aws-hostname:22", cfg)
if err != nil {
log.Fatal(err)
}
session, err = client.NewSession()
if err != nil {
log.Fatal(err)
}
log.Println("we have a session!")
...
恐慌意味着你忽略了某處的錯誤(或者在檢查錯誤之前設置延遲)。我們需要一些代碼來知道你在做什麼。 – JimB
@JimB我添加了一些代碼。我想我已經檢查了所有的錯誤。關閉會話的延遲是在錯誤檢查後設置的 – hey
你的恐慌是因爲你調用'defer session.Close()'在哪裏會話是零。 't.Error(err)'不會提早回來。 – JimB