使用SSH连接到服务器,使用golang连接pem/key

hey*_*hey 10 ssh go

我正在尝试使用Go编程语言的[ssh] [1]包使用密钥连接到amazon AWS linux服务器.但是包文档有点神秘/混乱.有没有人知道如何使用密钥通过ssh连接,或者至少是否可能?困扰我的是,在[拨号] [3]示例中,它说

// An SSH client is represented with a ClientConn. Currently only
// the "password" authentication method is supported.
Run Code Online (Sandbox Code Playgroud)

我基本上想模仿ssh -i x.pem root@server.com行为并在服务器内执行命令(例如whoami)

Jim*_*imB 21

您需要使用ssh.PublicKeys将列表ssh.Signers转换为ssh.AuthMethod.您可以使用从pem字节ssh.ParsePrivateKey获取a Signer,或者如果您需要使用rsa,dsa或ecdsa私钥,您可以将其提供给ssh.NewSignerFromKey.

这里有一个例子,也有一点代理支持(因为使用代理通常是在使用密钥文件后的下一步).

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!")

...
Run Code Online (Sandbox Code Playgroud)

  • 你不需要*在你的程序中使用代理,但是因为你*应该*一般使用一个代理(你的密钥都是安全加密的,对吧?),通常是使用后的下一个"如何"请求普通私钥文件. (2认同)

小智 10

下面是使用"普通私钥文件"远程运行ls的示例.

    pemBytes, err := ioutil.ReadFile("/location/to/YOUR.pem")
    if err != nil {
        log.Fatal(err)
    }
    signer, err := ssh.ParsePrivateKey(pemBytes)
    if err != nil {
        log.Fatalf("parse key failed:%v", err)
    }
    config := &ssh.ClientConfig{
        User: "ubuntu",
        Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)},
    }
    conn, err := ssh.Dial("tcp", "yourhost.com:22", config)
    if err != nil {
        log.Fatalf("dial failed:%v", err)
    }
    defer conn.Close()
    session, err := conn.NewSession()
    if err != nil {
        log.Fatalf("session failed:%v", err)
    }
    defer session.Close()
    var stdoutBuf bytes.Buffer
    session.Stdout = &stdoutBuf
    err = session.Run("ls -l")
    if err != nil {
        log.Fatalf("Run failed:%v", err)
    }
    log.Printf(">%s", stdoutBuf)
Run Code Online (Sandbox Code Playgroud)