为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
泛舟湖上清波郎朗 2021-12-20 19:30:11
我查看了各种资源。我不确定如何完成这项任务。我可以在本地连接没问题,但我无法轻松连接到远程。我需要传递 RSA .pem 密钥,但我不太确定如何在不强制不安全连接的情况下执行此操作package mainimport (    "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}
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超5个赞

我的理解是您需要打开与 postgre 数据库的连接。我不知道是否存在本地 postgre ssh 隧道支持。所以,这个关于 SSH 隧道到 DB 机器的答案。

我没有以这种方式测试过 postgre,但是我已经在一些专有服务器连接中使用了这个模型。

过程是这样的:

  1. 打开到数据库机器的 ssh 连接

  2. 建立从本地端口到远程数据库端口的隧道

  3. 在本地端口上打开数据库连接

您可以使用 OpenSSH 或 putty 等 ssh 客户端完成 #1 和 #2。你可能应该这样做 1st。如果外部客户端正常工作,那么您可以尝试将其全部放入 go 语言代码中,而无需外部 SSH 客户端。

在 go 你会使用

“golang.org/x/crypto/ssh”

包裹。

有关于如何使用 GO ssh 隧道的教程。以下不是未经错误检查的测试样本:

var buffer []byte

var err error

buffer, err = ioutil.ReadFile(sshKeyFile)

var key ssh.Signer

key, err = ssh.ParsePrivateKey(buffer)

var authMethod ssh.AuthMethod

authMethod = 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 库中。如果没有,则必须设置隧道。


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 537 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号