我正在尝试使用 Go 编程语言的 [ssh][1] 包通过 key 连接到亚马逊 AWS Linux 服务器。但是,包文档有点含糊/令人困惑。有谁知道如何使用 key 或至少在可能的情况下通过 ssh 进行连接?令我困扰的是,在 [Dial][3] 示例中它说
// An SSH client is represented with a ClientConn. Currently only
// the "password" authentication method is supported.
我基本上想模仿 ssh -i x.pem root@server.com 行为并在服务器内部执行命令(例如 whoami
)
最佳答案
您需要使用 ssh.PublicKeys
将 ssh.Signers
列表转换为 ssh.AuthMethod
。您可以使用 ssh.ParsePrivateKey
从 pem 字节中获取 Signer
,或者如果您需要使用 rsa、dsa 或 ecdsa 私钥,您可以将它们提供给 ssh.NewSignerFromKey
.
这里还有一个示例,它也对代理支持进行了充实(因为使用代理通常是在简单地使用 key 文件之后的下一步)。
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!")
...
关于ssh - 使用 SSH 和带有 golang 的 pem/key 连接到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50527998/