47

そのため、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つの質問をする必要はありません。これを聞かないように私が供給していないものはありますか?尋ねるのをやめるために私がしなければならないことはありますか?うまくいけば、誰かがいくつかのアイデアを持っています。ありがとう。

4

3 に答える 3

85

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

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

session.connect();

そして今、すべてが完璧に機能しています。

于 2012-06-04T17:24:31.270 に答える
12

自己承認された答えの解決策は正しいですが、説明が不足しています。

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

この問題は、KerberosがクライアントPCにインストールされるか、サーバーがKerberosのサポートを開始すると、自然に発生する可能性があります。

gssapi-with-mic解決策は、JSchの優先認証方法のリストからKerberos / GSSAPI()を削除することです。

session.setConfig(
    "PreferredAuthentications", "publickey,keyboard-interactive,password");
于 2017-04-20T07:31:02.530 に答える
0

すべての答えは正しいです。SFTPサーバーと統合しようとするときにSpringIntegrationで実行できる方法をここに追加します。

したがって、SFTP Spring Integrationを使用していて、Kerberosの奇妙なユーザーとパスワードが、OPが要求しているのと同じ方法でプロンプトを表示している場合。

次に、Spring構成を変更します(Java Spring Integration構成を使用しています。XML構成を使用している場合は、自分で翻訳を試みることができます。XML構成は本当に好きではありません:P):

したがって、SessionFactoryとして使用しているBeanでは、次の変更をconfigに追加する必要があります。

@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
    factory.setHost("hostname");
    factory.setPort(22);
    factory.setUser("username");
    factory.setPassword("superstrongpassword");
    factory.setAllowUnknownKeys(true);
    factory.setSessionConfig(buildSessionProperties());
    return new CachingSessionFactory<>(factory);
}

/**
 * Build JSch property PreferredAuthentications without "gssapi-with-mic"
 * This way it won't prompt for Kerberos authentication every time it tries to connect
 * to the SFTP.
 */
private Properties buildSessionProperties() {
    Properties sessionProperties = new Properties();
    sessionProperties.setProperty("PreferredAuthentications", "publickey,keyboard-interactive,password");
    return sessionProperties;
}
于 2020-09-25T16:09:26.960 に答える