首頁 > Java > java教程 > 主體

使用 Java 進行 SSH 隧道

DDD
發布: 2024-09-22 06:16:03
原創
725 人瀏覽過

SSH Tunnelling with Java

您鬆了一口氣,因為 QA 已批准在 Prod 上部署一項期待已久的功能。然而,作為該流程的一部分,它首先部署在 UAT 環境上,其中有測試帳戶可用於驗證該功能在本地開發人員和 QA 測試系統之外的工作情況。

但是...執行測試套件會導致很多失敗!


回覆總是相關的「但它可以在我的機器上運行!」

你是做什麼的?您確信程式碼可以工作。絕對確定。也許是 UAT 環境的問題?但環境可能會出現什麼問題呢?也許新建立的測試帳戶配置不正確?也許是的,你想。您可以存取環境的日誌,但失敗的場景僅限於沒有日誌來識別問題。你內心咒罵你祖先的開發者。

另一個選擇?遠端調試!雖然這是一個好主意,但對於經常使用應用程式的環境來說,它很少實用。如果您的程式碼位於「熱路徑」中,那麼祝您好運,弄清楚您的請求是什麼。它還可能會顯著減慢應用程式的速度。

本質上,你想要的是調試應用程序,就像它部署在你的本地機器上一樣,但是UAT伺服器的資料庫。但由於本地應用程式無法直接訪問 UAT 伺服器,所以你運氣不好。

或者你是嗎?不用擔心,因為 SSH 隧道可以幫助您。

SSH 隧道

什麼是 SSH 隧道?以及如何使用它?

簡短回答:

SSH 隧道將允許您的應用程式表現得就像部署在遠端系統上一樣,透過該系統可以存取 UAT 資料庫。

長答:

Linux ssh 指令提供了「連接埠轉送」功能。誠然,「連接埠轉送」這個詞相當不具描述性。因此,我將讓 StackOverflow 為您提供比我在這裡提供的更詳細、更簡單的 SSH 隧道解釋。您可以在這裡閱讀:https://unix.stackexchange.com/a/115906。我建議您閱讀答案,因為它的圖表比基於文字的答案更容易理解。

不過,我還是將相關部分複製到這裡。

ssh -L 123:farawayhost:456 remotehost
登入後複製

local: -L 指定本機(客戶端)主機上的給定連接埠將轉送到遠端的給定主機和連接埠。
ssh -L sourcePort:forwardToHost:onPort connectToHost 意思是:使用ssh 連接到connectToHost,並將所有連接嘗試轉送到local sourcePort 到名為forwardToHost 的機器上的on 端口,可以是從connectToHost 機器到達。

例子

對於我們的用例,我們的範例命令將是:

ssh -L <Local Port>:<UAT Database IP>:<UAT Database Port> <JumpHost IP>
登入後複製

注意,這裡的JumpHost是一個可以連接到的系統與連接埠

一旦我們弄清楚了這一點,其他一切都是小菜一碟!

您只需執行指令,就可以存取本機上的 UAT 資料庫:<本機連接埠>。感覺就像魔法一樣!

如果需要連接多個資料庫,則需要多次執行此命令。或者您可以編寫一個 bash 腳本,該腳本可以動態讀取設定檔以開啟多個 SSH 隧道。

身為 Java 程式設計師,我寧願處理靜態編譯的 Java 程式碼,也不願擔心像 bash 這樣的動態型別語言。因此,我利用 jsch 庫創建了一個可擴展項目,該項目創建並維護多個 SSH 隧道。您可以在這裡查看:https://github.com/darshitpp/java-ssh-tunnel

結構

java-ssh-tunnel
└── src
    └── main
        ├── java
        │   └── dev
        │       └── darshit
        │           └── java_ssh_tunnel
        │               ├── Main.java
        │               ├── MultiTunneler.java
        │               ├── Tunneler.java
        │               └── ssh
        │                   ├── TunnelDetails.java
        │                   └── UserDetails.java
        └── resources


登入後複製

用法

  1. 下載項目
  2. 在您的 IDE 中載入
  3. 運行 mvn clean install
  4. 使用 SSH 使用者名稱、SSH 密碼、JumpHost sshHost 等所需詳細資訊來變更 Main.java
  5. (可選)也許從檔案載入 localPort、remoteHost 和 remotePort 詳細資料
  6. 運行Main.java

如果一切順利,您將在標準輸出上看到以下輸出

Starting tunneling...
<remoteHost>:<remotePort> is available on localhost:<localPort>
Press Enter to terminate the tunnels...
登入後複製

注意事項

雖然上述非常方便,請勿使用它連接到 PROD。是的,必須用粗體寫出來並強調。我也應該將訊息列印到 stderr 嗎?請在下面評論。

以上是使用 Java 進行 SSH 隧道的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板