我看过各种资源。我不确定如何完成此任务。我可以在本地连接,没问题,但是我无法轻松连接到遥控器。我需要传递一个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
}
据我了解,您需要打开与postgre数据库的连接。我不知道是否存在本机的postgre ssh隧道支持。因此,关于SSH隧道传输到数据库机的答案。
我没有以这种方式测试postgre,但是我已经在某些专有服务器连接中使用了该模型。
过程如下:
您可以使用SSH客户端(例如OpenSSH或putty)来完成#1和#2。您可能应该这样做1。如果外部客户端有效,那么您可以尝试在没有外部SSH客户端的情况下将其全部放入语言代码中。
在使用中,您将使用
“ 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)
上面的最后一行并不完全是隧道传输,而是一个向DB服务器开放的TCP连接。您也许可以将该连接传递到数据库库中。如果没有,则必须设置一个隧道。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句