首页  >  文章  >  后端开发  >  如何在 Go 中使用 PEM/Key 进行 SSH 身份验证?

如何在 Go 中使用 PEM/Key 进行 SSH 身份验证?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-04 01:47:01452浏览

How to Authenticate to SSH with a PEM/Key in Go?

在 Go 中使用 pem/Key 进行 SSH 身份验证

使用私钥连接到远程 SSH 服务器是一种便捷的方法自动化任务并管理资源。 Go编程语言提供了ssh包,它提供了对建立SSH连接的支持。但是,文档对于如何使用私钥进行身份验证可能有些不清楚。

要使用带有 pem 密钥的 SSH 连接到服务器,您可以按照以下步骤操作:

  1. 获取签名者:您需要从您的私钥获取 ssh.Signer。这可以使用特定密钥类型(例如 rsa、dsa、ecdsa)的 ssh.ParsePrivateKey 函数或 ssh.NewSignerFromKey 函数来完成。
  2. 创建 AuthMethod: 转换 Signer 对象使用 ssh.PublicKeys 函数进入 ssh.AuthMethod。这会包装签名者并允许其在 SSH 连接期间用于身份验证。
  3. 配置 ClientConfig: 设置一个 ssh.ClientConfig 对象,其中包括您的身份验证方法、用户名和任何其他内容必要的配置参数。
  4. 拨号连接:使用 ssh.Dial 函数使用您的 ClientConfig 建立与远程服务器的连接。
  5. 创建会话: 建立连接后,创建 ssh.Session 以在远程服务器上执行命令。

示例:

<code class="go">package main

import (
    "crypto/x509"
    "fmt"
    "io/ioutil"
    "log"
    "net"
    "os"

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

func main() {
    // Parse the private key
    key, err := ioutil.ReadFile("mykey.pem")
    if err != nil {
        log.Fatal(err)
    }

    // Get the signer
    signer, err := ssh.ParsePrivateKey(key)
    if err != nil {
        log.Fatal(err)
    }

    // Switch to using an agent if SSH_AUTH_SOCK is set
    if authSock := os.Getenv("SSH_AUTH_SOCK"); authSock != "" {
        sock, err := net.Dial("unix", authSock)
        if err != nil {
            log.Fatalf("Failed to connect to agent: %v", err)
        }
        _ = sock
        // TODO(harsh)
        // Implement working with agent.
    }

    // Create the AuthMethod
    authMethods := []ssh.AuthMethod{ssh.PublicKeys(signer)}

    // Set up the ClientConfig
    clientConfig := &ssh.ClientConfig{
        User:            "username",
        Auth:            authMethods,
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }

    // Dial the connection
    client, err := ssh.Dial("tcp", "aws-hostname:22", clientConfig)
    if err != nil {
        log.Fatal(err)
    }

    // Create a session
    session, err := client.NewSession()
    if err != nil {
        log.Fatal(err)
    }

    // Execute a command
    output, err := session.Output("whoami")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Output:", string(output))

    // Close the session and client
    _ = session.Close()
    _ = client.Close()
}</code>

通过按照以下步骤,您可以使用私钥建立安全的 SSH 连接,并使用 Go 标准库的 ssh 包在远程服务器上执行命令。

以上是如何在 Go 中使用 PEM/Key 进行 SSH 身份验证?的详细内容。更多信息请关注PHP中文网其他相关文章!

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