ssh - 使用 SSH 和带有 golang 的 pem/key 连接到服务器

标签 ssh go

我正在尝试使用 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.PublicKeysssh.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/

相关文章:

使用 connect() 函数连接到 IP 地址 - 套接字编程

bash - 通过ssh登录时自动运行脚本

git - 戈朗 : Executing a command with its arguments

go - 如何漂亮地打印一个 Golang 结构?

ssh - 谷歌云计算引擎 : cannot connect with ssh even from within browser

c# - SFTP 和 "FTP over SSH"的区别

azure - 具有 Azure AD 访问权限的 Terraform Azure Linux VM

reflection - 在不使用反射的情况下检查 Go 中的接口(interface)值是否为 nil

Golang echo包中间件实现

templates - Go模板无法与if和range一起正常使用