亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 go-sql-driver 通過標準 TCP/IP 通過 SSH 連接到 MySQL?

如何使用 go-sql-driver 通過標準 TCP/IP 通過 SSH 連接到 MySQL?

Go
冉冉說 2021-11-22 16:48:07
我目前正在 Windows 8.1 上使用 MySQL Workbench,通過 SSH 使用標準 TCP/IP 訪問 Linux 服務器上的遠程 MySQL 數據庫?;旧衔矣幸韵滦畔ⅲ篠SH 主機名:dbserver.myorg.com:ssh-portSSH 用戶名:myRemoteLoginUsernameSSH 密碼:(存儲在保險庫中)SSH 密鑰文件:本地 .ppk 文件的路徑MySQL 主機名:127.0.0.1MySQL 服務器端口:3306用戶名:myRemoteDbUsername密碼:(存儲在保險庫中)默認架構:myRemoteDatabaseName如何使用 github.com/go-sql-driver/mysql 從 Go 命令應用程序連接到數據庫?我的 sql.Open 語句中的 DataSourceName 字符串應該是什么樣的?    db, err := sql.Open("mysql", <DataSourceName> ) {}準備工作 DataSourceName 字符串是否需要任何額外的工作?在我的 Windows PC 上,我安裝了膩子。我閱讀了隧道并為端口 3306 (D3306) 添加了動態隧道。我希望這能讓我使用到 localhost:3306 的連接進行連接,并在我使用膩子連接到遠程主機時自動將請求轉發到遠程數據庫,但這也沒有按預期工作。
查看完整描述

2 回答

?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

我答應提供我的例子,它來了?;旧衔业慕鉀Q方案建立了一個到遠程服務器的 ssh 隧道并通過這個隧道查詢遠程數據庫。ssh 隧道是解決方案的一部分。

我必須做的第一件事是將 PuTTY .ppk 私鑰文件轉換為有效的 OpenSSH .pem 密鑰文件。這可以使用 PuTTYgen 中的導出功能輕松完成。因為我想支持密碼加密的私鑰,所以我還需要一個函數來解密密鑰并將其從解密的原始格式重新格式化為 golang.org/x/crypto/ssh/ParsePrivateKey 接受的有效格式,這是獲取用于身份驗證的簽名者列表。

解決方案本身由包含在兩個文件中的包組成。應用程序的主要部分在 main.go 中完成,其中包含所有相關的數據分配以及與數據庫查詢相關的代碼。與 ssh 隧道和密鑰處理相關的所有內容都包含在 sshTunnel.go 中。

該解決方案不提供安全密碼存儲的機制,也不要求輸入密碼。密碼在代碼中提供。但是,實現密碼請求的回調方法并不會太復雜。

請注意:從性能角度來看,這不是一個理想的解決方案。它還缺乏適當的錯誤處理。我已經提供了這個例子。

該示例是一個經過測試且有效的示例。我在 Windows 8.1 PC 上開發并使用了它。數據庫服務器位于遠程 Linux 系統上。您需要更改的只是 main.go 中的數據和查詢部分。


查看完整回答
反對 回復 2021-11-22
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

好吧,我認為你可以做到“全圍棋”。

SSH 部分和端口轉發

我喜歡的東西就這樣(我沒有谷歌更好的例子)。

請注意此代碼的兩個問題:

  1. 它實際上并不正確:它接受客戶端連接之前連接到遠程套接字 ,而它應該相反:接受客戶端連接到端口轉發的本地套接字,然后使用活動的 SSH 會話連接到遠程套接字,如果成功, 生成兩個 goroutines 以在這兩個套接字之間鏟除數據。

  2. 在配置 SSH 客戶端時,它出于未知原因明確允許基于密碼的身份驗證。您不需要這個,因為您使用的是基于公鑰的身份驗證。

一個可能會絆倒您的障礙是管理對您的 SSH 密鑰的訪問。它的問題在于一個好的密鑰應該受密碼保護。

你說密鑰的密碼“存儲在價值中”,老實說,我不知道“價值”是什么。

在我使用的系統上,SSH 客戶端要么要求輸入密碼來解密密鑰,要么使用所謂的“SSH 代理”:

  • 在基于 Linux 的系統上,它通常是ssh-agent在后臺工作的 OpenSSH二進制文件,它通過 Unix 域套接字訪問,并通過檢查名為SSH_AUTH_SOCK.

  • 在 Windows 上,我使用 PuTTY,它有自己的代理pageant.exe. 我不知道 PuTTY SSH 客戶端使用哪種方式來定位它。

要訪問 OpenSSH 代理,golang.org/x/crypto/ssh提供agent可用于定位代理并與之通信的子包。如果您需要從 獲取密鑰pageant,恐怕您需要弄清楚使用什么協議并實現它。

MySQL部分

下一步是將其與go-sql-driver.

我會以最簡單的方式開始:

  1. 當您的 SSH 端口轉發工作時,讓它在本地主機上的隨機端口上偵聽傳入連接。當連接打開時,從返回的連接對象中獲取端口。

  2. 使用該端口號構建連接字符串以傳遞給sql.DB您將創建以使用的實例go-sql-driver。

然后驅動程序將連接到您的端口轉發端口,您的 SSH 層將完成剩下的工作。

在您完成這項工作后,我將探討您選擇的驅動程序是否允許進行一些更細粒度的調整,例如允許您直接將一個io.ReadWriter(打開的套接字)的實例傳遞給它,以便您可以完全跳過端口轉發設置和只需生成通過 SSH 轉發的新 TCP 連接,即跳過“本地偵聽”步驟。


查看完整回答
反對 回復 2021-11-22
  • 2 回答
  • 0 關注
  • 282 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號