若是你們用過一些數據庫客戶端軟件,會發現裏面有一項是SSH,可使用SSH通道來鏈接到遠程主機的數據庫,此時咱們就可使用內網IP來直連數據庫了。不知道你們有多少是這麼用數據庫的,我想這麼設定確定是爲了安全吧。
好麼,如今問題來了,我想用程序連一下這個數據庫該怎麼辦?那庫只有內網IP,那隻能用程序來模擬一個SSH通道了。
我在網上一直找相關的類庫,一直沒有找到,最後在神奇的stackoverflow上找到一個回答才知道有個類庫叫作jsch,功能異常強大,我這水平通常,徹底沒有搞懂其餘功能,只發現了一個對本次主題有用的功能——端口映射。其實原理很簡單,就是你給定SSH登陸信息,登陸後產生一個Session會話,而後將服務器上的某個端口映射到本地,這樣就可使用本地鏈接來鏈接數據庫了。 java
OK,先把這段代碼地址貼出來。https://github.com/looly/common-tools/blob/master/src/main/java/com/baijob/commonTools/net/SSHUtil.java git
好的,咱們開始。先貼測試代碼 github
package com.baijob.commonTools; import com.baijob.commonTools.net.SSHUtil; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; public class CommonTest { public static void main(String[] args) { Session session = SSHUtil.openSession("跳板機外網IP", 22, "username", "123456"); try { boolean bindPort = SSHUtil.bindPort(session, "數據庫服務器內網IP", 3306, 3306); } catch (JSchException e) { e.printStackTrace(); } } }這個類的使用方法異常簡單分紅兩個步驟:
step3:咱們就能夠用JDBC鏈接此數據庫了,固然鏈接字符串是這樣的:localhost:3306 數據庫
其實不僅鏈接數據庫,咱們可使用此方式把服務器上任意端口映射下來使用(想一想把80端口映射下來的趕腳) 安全
其實在https://github.com/looly/common-tools/tree/master/src/main/java/com/baijob/commonTools/db/ds下已經自動集成了經過SSH tunnel鏈接數據庫的方法,只要按照https://github.com/looly/common-tools/blob/master/src/main/resources/config/db-example.setting的方式配置數據庫鏈接便可簡單的操做數據庫。這個後續再說。 服務器
最後爲雅安祈福吧,不知道他們的每一個夜晚是怎麼過來的…… session