ファイアウォールの背後にある2番目のサーバーに接続するには、原則として2つのオプションがあります。
ssh
単純な方法は、(execチャネルから)最初のサーバーを呼び出して、適切なサーバーを示すことです。これには、JSchを使用したエージェント転送が必要であり、2番目のサーバーにアクセスするためのJSch APIは提供されず、sshコマンドラインのみが提供されます。
最初のサーバーへの接続を使用してTCPトンネルを構築し、このトンネルを使用して2番目のサーバーに接続することをお勧めします。JSch Wikiには、2番目のJSchセッションのトンネルとしてJSchセッションを使用できるようにするProxySSHクラス(いくつかのサンプルコードとともに)が含まれています。(免責事項:このクラスは主に私が作成し、JSchの作成者のサポートもあります。)
2番目のサーバーに接続したら、1つのshell
チャネルまたは一連のexec
チャネルのいずれかを使用してコマンドを実行します。(概要については、JSch WikiのShell、Exec、またはSubsystem Channelを参照してください。詳細については、 Javadocを参照してください。)
不明なホストキーの問題の場合:
安全なバージョンは、以前にすべてのホストキーを(安全な方法で)収集し、それらをknown_hostsファイルに配置することです。(提示されたキーを単に信頼する場合、中間者攻撃に対して脆弱です。ネットワークでこれらが問題にならない場合は、物理的に保護されているため、適切です。)
便利なバージョンは、構成オプション StrictHostKeyChecking
を次のように設定することです。no
これにより、不明なホストキーがホストキーファイルに追加されます。
JSch.setConfig("StrictHostKeyChecking", "no");
(トンネルセッションではなくプロキシセッションにのみ設定する場合は、セッションで個別に設定することもできます。または、またはを使用したトンネルセッションでオーバーライドすることもyes
できask
ます。MITMの危険性が高くなる可能性があります。)
中間の方法は、実際にユーザーに質問できるようにすることです(指紋をリストと比較する必要があります)。このために、UserInfo
インターフェイスを実装し、オブジェクトをセッションに提供します。(JSch Wikiには、Swing JOptionPanesを使用した実装例が含まれています。これは、クライアントプログラムがGUIを備えたシステムで実行されている場合に簡単に使用できます。)
受け入れられたホストキーの保存を機能させるにJSch.setKnownHosts
は、InputStream引数を持つメソッドではなく、ファイル名引数を持つメソッドを使用する必要があります。そうしないと、クライアントを再起動するたびに受け入れを繰り返す必要があります。