Golang SSH 隧道连接到远程 postgres 数据库

我查看了各种资源。我不确定如何完成这项任务。我可以在本地连接没问题,但我无法轻松连接到远程。我需要传递 RSA .pem 密钥,但我不太确定如何在不强制不安全连接的情况下执行此操作


package main


import (

    "database/sql"

    "fmt"

    "os"


    _ "github.com/lib/pq"

)


var (

    dbUser  = os.Getenv("DB_USER")

    dbPass  = os.Getenv("DB_PASS")

    dbName  = os.Getenv("DB_NAME")

    dbHost  = os.Getenv("DB_HOST")

    dbPort  = os.Getenv("DB_PORT")

    sslMode = os.Getenv("SSLMODE")

)


// ConnectDb is a short cut function that takes parameters through

// CLI that returns a pointer to a sql.DB connection.

// It takes no arguments.

func ConnectDb() (*sql.DB, error) {


    db, err := sql.Open("postgres", getDbInfo())

    CheckErr(err, "Unable to connecto tthe DB")


    if err := db.Ping(); err != nil {

        return nil, err

    }


    return db, nil

}


func getDbInfo() string {

    var dbInfo string


    if dbName != "" {

        dbInfo += fmt.Sprintf("dbname=%s ", dbName)

    } else {

        dbInfo += fmt.Sprintf("dbname=%s ", "development")

    }


    // checks for nil value

    if dbUser != "" {

        dbInfo += fmt.Sprintf("dbuser=%s ", "user")

    }


    // checks for nil value

    if dbPass != "" {

        dbInfo += fmt.Sprintf("dbpass=%s ", dbPass)

    }


    if sslMode != "" {

        dbInfo += fmt.Sprintf("sslmode=%s", sslMode)

    } else {

        dbInfo += fmt.Sprintf("sslmode=disable")

    }


    return dbInfo

}


泛舟湖上清波郎朗
浏览 538回答 1
1回答

慕娘9325324

我的理解是您需要打开与 postgre 数据库的连接。我不知道是否存在本地 postgre ssh 隧道支持。所以,这个关于 SSH 隧道到 DB 机器的答案。我没有以这种方式测试过 postgre,但是我已经在一些专有服务器连接中使用了这个模型。过程是这样的:打开到数据库机器的 ssh 连接建立从本地端口到远程数据库端口的隧道在本地端口上打开数据库连接您可以使用 OpenSSH 或 putty 等 ssh 客户端完成 #1 和 #2。你可能应该这样做 1st。如果外部客户端正常工作,那么您可以尝试将其全部放入 go 语言代码中,而无需外部 SSH 客户端。在 go 你会使用“golang.org/x/crypto/ssh”包裹。有关于如何使用 GO ssh 隧道的教程。以下不是未经错误检查的测试样本:var buffer []bytevar err errorbuffer, err = ioutil.ReadFile(sshKeyFile)var key ssh.Signerkey, err = ssh.ParsePrivateKey(buffer)var authMethod ssh.AuthMethodauthMethod = ssh.PublicKeys(key)sshConfig = &ssh.ClientConfig{    User: "user_id",    Auth: []ssh.AuthMethod{authMethod},}conn, err := ssh.Dial("tcp", endpoint, sshConfig)// open connection on postgre:dbConn, err = conn.Dial("tcp", dbEndpoint)上面的最后一行不是完全隧道,而是打开到数据库服务器的 TCP 连接。您也许可以将该连接传递到 db 库中。如果没有,则必须设置隧道。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go