首页  >  文章  >  后端开发  >  如何使用 Go 的 ssh 包建立带有密钥的 SSH 连接?

如何使用 Go 的 ssh 包建立带有密钥的 SSH 连接?

Linda Hamilton
Linda Hamilton原创
2024-11-02 12:47:30952浏览

How to Establish SSH Connections with Keys Using Go's ssh Package?

使用 Go 的 ssh 包通过密钥建立 SSH 连接

使用密钥通过 SSH 连接到远程服务器是系统管理中的一项基本任务和开发运营。 Go 编程语言提供了 ssh 包来处理 SSH 连接。然而,浏览其文档可能具有挑战性。

问题出现了:我们可以使用密钥文件或带有 Go ssh 包的私钥连接到 SSH 服务器吗?

文档说明目前仅支持“密码”认证方式。不用担心,因为完全可以使用密钥文件或私钥建立连接。

解锁此功能的关键在于将密钥文件转换为 ssh.Signer,然后将其嵌入到 ssh 中.AuthMethod.PublicKeys。以下是详细说明该过程的示例代码片段:

<code class="go">import (
    "crypto/ecdsa"
    "crypto/x509"
    "encoding/pem"
    "fmt"
    "io/ioutil"
    "log"
    "net"

    "golang.org/x/crypto/ssh"
    "golang.org/x/crypto/ssh/agent"
)

func main() {
    pemBytes, err := ioutil.ReadFile("my_key.pem")
    if err != nil {
        log.Fatal(err)
    }

    block, _ := pem.Decode(pemBytes)
    privKey, err := x509.ParseECPrivateKey(block.Bytes)
    if err != nil {
        log.Fatal(err)
    }

    signer, err := ssh.NewSignerFromKey(privKey)
    if err != nil {
        log.Fatal(err)
    }

    auths := []ssh.AuthMethod{ssh.PublicKeys(signer)}

    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)
    }

    stdout, err := session.Output("whoami")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(string(stdout))
}</code>

此增强的代码可以处理密钥文件和私钥,提供更全面的解决方案。在示例中,使用了 ecdsa 密钥,但该概念适用于任何类型的私钥。

结论:

Go ssh 包允许建立 SSH 连接使用按键。可以理解的是,文档可能看起来很复杂。通过利用 ssh.PublicKeys 并使用 ssh.Signer 将密钥转换为适当的格式,可以无缝连接并执行基本的系统任务。

以上是如何使用 Go 的 ssh 包建立带有密钥的 SSH 连接?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn