web-dev-qa-db-ja.com

Javaを介したSFTP接続で奇妙な認証を要求する

そのため、SFTP経由でリモートサーバーに接続し、ファイルをプルダウンして、ファイルを処理する必要がある小さなプログラムを作成しています。ここでJSchにいくつかの答えを見つけましたが、それはタスクに最適に見えました。これまでのところ、使いやすく、問題なく機能しています。修正したい小さなことが1つあります。次のコードを使用して、ファイルを接続してプルします。

    JSch jsch = new JSch();
    Session session = null;
    try {
        session = jsch.getSession("username", "127.0.0.1", 22);
        session.setConfig("StrictHostKeyChecking", "no");
        session.setPassword("password");
        session.connect();

        Channel channel = session.openChannel("sftp");
        channel.connect();
        ChannelSftp sftpChannel = (ChannelSftp) channel;
        sftpChannel.cd(REMOTE_FTP_DIR);
        sftpChannel.lcd(INCOMING_DIR);
        sftpChannel.get(TMP_FILE, TMP_FILE);
        sftpChannel.exit();
        session.disconnect();
    } catch (JSchException e) {
        e.printStackTrace();
    } catch (SftpException e) {
        e.printStackTrace();
    }

これでうまくいき、ファイルを取得しました。私はLinuxサーバーでこのコードを実行しています。コードを実行すると、JSchがKerberosユーザー名とパスワードを要求します。それは次のようになります:

Kerberosユーザー名[george]:

GeorgeのKerberosパスワード:

両方の質問でEnterキーを押すだけで、プログラムは問題なく続行しているようです。ただし、このコードをcronタスクで自動化する必要があるため、プログラムを一時停止してこれら2つの質問をするのは避けたいです。これを尋ねないように、私が提供していないものはありますか?尋ねるのをやめるために私がしなければならないことは?うまくいけば、誰かがいくつかのアイデアを持っています。ありがとう。

43
cardician

他の誰かが同様の問題に遭遇する場合があるので、私はここに答えを投稿すると思いました。すべての違いを生むコードが欠けていることがわかりました。追加する必要がありました

session.setConfig("PreferredAuthentications", 
                  "publickey,keyboard-interactive,password");

session.connect();

そして今、すべてが完璧に動作します。

82
cardician

自己承認回答の解は正しいですが、説明はありません。

問題は、OPがKerberos/GSSAPI認証を優先(JSchデフォルト)として設定していることです。それでも、OPはKerberosプロンプトにユーザー名またはパスワードを指定しないと主張しているため、OPは実際にそれを使用/使用しているようには見えません。

解決策は、Kerberos/GSSAPI(gssapi-with-mic)推奨される認証方法のリストから:

session.setConfig(
    "PreferredAuthentications", 
    "publickey,keyboard-interactive,password");
11
Martin Prikryl