ホームページ  >  記事  >  Java  >  Java を使用した SSH トンネリング

Java を使用した SSH トンネリング

DDD
DDDオリジナル
2024-09-22 06:16:03714ブラウズ

SSH Tunnelling with Java

QA が、待望の製品への展開を承認したので、安堵のため息をつきました。ただし、プロセスの一部として、最初に 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 に接続し、すべての接続試行を ローカル sourcePort に forwardToHost というマシン上のポート onPort に転送します。 connectToHost マシンから到達しました。

このユースケースの場合、サンプル コマンドは次のようになります:

ssh -L 568e74c5956ba89112fe7fdaabb41460:b2f665a9b90666d6a83e424219399c6f:dc3263fd61fcd67fbc142f42df1434e2 5d52d8acfe7b7e4852ce923bbefbb027

ここでの JumpHost は、 に接続できるシステムであることに注意してください。ポート を使用します。

これを理解すれば、他のことは簡単です!

コマンドを実行するだけで、ローカルホスト:aefdd831f742e56c1b4618264ae0a63e 上の UAT データベースにアクセスできるようになります。まるで魔法のようです!

複数のデータベースに接続する必要がある場合は、このコマンドを複数回実行する必要があります。または、構成ファイルを動的に読み取って複数の SSH トンネルを開くことができる bash スクリプトを作成することもできます。

私は Java プログラマーなので、bash のような動的に型付けされた言語について心配するよりも、静的にコンパイルされた Java コードを扱いたいと思っています。そこで、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 クリーン インストールを実行する
  4. Main.java を、SSH ユーザー名、SSH パスワード、JumpHost sshHost などの必要な詳細情報に変更します。
  5. (オプション) ファイルから localPort、remoteHost、remotePort の詳細をロードする可能性があります
  6. Main.java を実行する

すべてがうまくいけば、標準出力に次の出力が表示されます

Starting tunneling...
ddcb5c1bacff0836f10cdd2321f9f344:8a6b8c664579886bf5b95b43fd19938f is available on localhost:64967425d451d2d8f5c2863f9f50868c
Press Enter to terminate the tunnels...

注意事項

上記は非常に便利ですが、製品への接続には使用しないでください。はい、強調して太字で書かなければなりませんでした。メッセージを標準エラー出力にも出力しましょうか?以下にコメントしてください。

以上がJava を使用した SSH トンネリングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。