7

JavaプログラムからリモートサーバーにSSHで接続し、そこから別のサーバーにSSHで接続できる必要があります。クライアントに両方のサーバーの資格情報があります。

コマンドは、アプリ内から通常の文字列として自動的に渡されます(ユーザー入力なし)。2番目のサーバーでこれらのカスタムコマンドを実行し、出力といくつかの単純なロジックに基づいて、実行時に発行するコマンドを決定できる必要があります。

JSchを使用してそれを行うことはできますか?はいの場合、どこから調べればよいですか?(例、情報)

================================================== ===========

追加した:

スレッド「メイン」の例外com.jcraft.jsch.JSchException:UnknownHostKey:host.net。RSAキーのフィンガープリントは「blahblahblah」です

今までのように、known_hostsファイルを変更し、そこに手動でhostを追加することで、この問題を解決しています。このYES-NOの質問があったときに、JSchに自動的にYESを押すように指示するオプションをどこかに設定することで、この小さな問題を回避できますか?

4

3 に答える 3

12

ファイアウォールの背後にある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引数を持つメソッドではなく、ファイル名引数を持つメソッドを使用する必要があります。そうしないと、クライアントを再起動するたびに受け入れを繰り返す必要があります。

于 2011-07-21T00:51:01.510 に答える
1

SSHトンネル(別名ローカルポートフォワーディング)を使用して、A経由でBへのSSH/SFTP接続を開きます。

Session sessionA = jsch.getSession("usernameA", "hostA");
// ...
sessionA.connect();

int forwardedPort = 2222; // any port number which is not in use on the local machine
sessionA.setPortForwardingL(forwardedPort, "hostB", 22);

Session sessionB = jsch.getSession("usernameB", "localhost", forwardedPort);
// ...
sessionB.connect();

// Use sessionB here for shell/exec/sftp

例外に対処UnknownHostKeyする必要があるかもしれません。

于 2018-05-02T07:58:33.193 に答える
0

これは誰にでも役立ちます。正常に動作します:

 public static void sesionA(){
     try {
        Session sessionA = jSch.getSession(username, hostA);  
        Properties config = new Properties(); 
        config.put("StrictHostKeyChecking", "no");
        sessionA.setConfig(config);
        sessionA.setPassword(passwordA);
        sessionA.connect();


        if(sessionA.isConnected()) {
            System.out.println("Connected host A!");
            forwardedPort = 2222;
            sessionA.setPortForwardingL(forwardedPort, hostB, 22);      
        }

    } catch (JSchException e) {
        e.printStackTrace();
    }
 }

 public static void sesionB(){


        try {
            Session sessionB = jSch.getSession(username, "localhost", forwardedPort);

            Properties config = new Properties(); 
            config.put("StrictHostKeyChecking", "no");
            sessionB.setConfig(config);
            sessionB.setPassword(passwordB);
            sessionB.connect();

          if(sessionB.isConnected()) {
             System.out.println("Connected host B!");
          }
     }
 }
于 2018-07-26T00:05:55.280 に答える