英文:
Golang SSH client error "unable to authenticate, attempted methods [none publickey], no supported methods remain"
问题
由于某种原因,Golang SSH客户端无法连接到我的EC2实例。它抛出以下错误:
ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain
这是我的代码:
package main
import (
"fmt";
"github.com/helloyi/go-sshclient"
)
func main() {
client, err := sshclient.DialWithKey("ip:port", "ubuntu", "my_key.pem")
if err != nil {
fmt.Println(err)
return
}
out, err := client.Cmd("help").Output()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(out))
}
有趣的是,当我在另一台计算机上运行此代码时,连接成功且没有任何错误。所以我认为这一定是计算机的问题,而不是我的代码问题。我还尝试使用Python的Paramiko客户端连接到实例,结果完美无误。当然,我还尝试使用CMD中的ssh
命令和MobaXTerm客户端进行连接 - 都成功了。我还尝试使用其他Golang SSH客户端golang.org/x/crypto/ssh
,但它也无法工作(同样的错误)。
谢谢你的帮助。
英文:
For some reason Golang SSH client can't connect to my EC2 instance. It throws the following error:
ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain
This is my code:
package main
import (
"fmt"
"github.com/helloyi/go-sshclient"
)
func main() {
client, err := sshclient.DialWithKey("ip:port", "ubuntu", "my_key.pem")
if err != nil {
fmt.Println(err)
return
}
out, err := client.Cmd("help").Output()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(out))
}
What's interesting is that when I ran this code on my other computer the connection was made without any errors. So I think it must be a problem with the PC and not my code. I also tried connecting to the instance in Python using Paramiko client and it worked flawlessly. Of course I tried connecting using ssh
command in CMD and MobaXTerm client - both worked. I tried using other Golang SSH client golang.org/x/crypto/ssh
and it didn't work (same error).
Thank you for your help.
答案1
得分: 3
显然,这是一个与go.mod
文件有关的问题。golang.org/x/crypto
和golang.org/x/sys
都已过时,一旦我更新它们,它就开始工作了。感谢@kkleejoe的帮助。
英文:
Apparently, it was an issue with go.mod
file. Both golang.org/x/crypto
and golang.org/x/sys
were outdated, once I updated them it started working. Thanks @kkleejoe for your help.
答案2
得分: 1
假设您可以无需密码执行 ssh user@host
,公钥可能是 ~/.ssh/id_rsa
或 ~/.ssh/id_ecda
。
import "golang.org/x/crypto/ssh"
import "io/ioutil"
import "strconv"
func DialWithPublickey(addr string, port int, user, publickeyfile string) (*ssh.Client, error) {
key, err := ioutil.ReadFile(publickeyfile)
if err != nil {
return nil, err
}
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
return nil, err
}
client, err := ssh.Dial("tcp", addr+":"+strconv.Itoa(port), &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)},
HostKeyCallback: ssh.HostKeyCallback(func(string, net.Addr, ssh.PublicKey) error { return nil }),
})
if client == nil || err != nil {
return nil, err
}
client.SendRequest(user+"@"+addr, true, nil) // keep alive
return client, nil
}
尝试 `DialWithPublickey(host, port, user, "~/.ssh/id_rsa")`
英文:
assume you can ssh user@host
without password, public key may be ~/.ssh/id_rsa
or ~/.ssh/id_ecda
import "golang.org/x/crypto/ssh"
import "io/ioutil"
import "strconv"
func DialWithPublickey(addr string, port int, user, publickeyfile string) (*ssh.Client, error) {
key, err := ioutil.ReadFile(publickeyfile)
if err != nil {
return nil, err
}
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
return nil, err
}
client, err := ssh.Dial("tcp", addr+":"+strconv.Itoa(port), &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)},
HostKeyCallback: ssh.HostKeyCallback(func(string, net.Addr, ssh.PublicKey) error { return nil }),
})
if client == nil || err != nil {
return nil, err
}
client.SendRequest(user+"@"+addr, true, nil) // keep alive
return client, nil
}
try DialWithPublickey(host, port, user, "~/.ssh/id_rsa")
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论