使用 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中文网其他相关文章!