Java中的SFTP连接要求进行奇怪的身份验证

50

我正在编写一个小程序,需要通过 SFTP 连接到远程服务器,下载文件,然后处理该文件。通过一些答案,我发现 JSch 看起来非常适合这个任务。到目前为止,它很容易使用,而且我已经让它正常工作了,只有一个小问题需要解决。我使用以下代码进行连接和下载文件:

    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密码:

我只需按回车键回答这两个问题,然后程序似乎就可以继续运行而没有任何问题了。但是,我需要通过cron任务对此代码进行自动化处理,因此我宁愿不让它暂停程序来询问我这两个问题。是否有什么我没有提供的东西,可以使其不再提供这些信息?是否需要采取某些措施来阻止它继续询问?希望有人能提出一些想法。谢谢。


为了后人,这可能与以下相关:https://issues.apache.org/bugzilla/show_bug.cgi?id=53437 - Aaron
4个回答

90

我想在这里发表一个答案,以防其他人遇到类似的问题。结果证明我缺少了一段代码,这段代码使一切变得不同。我只需要添加:

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

之前

session.connect();

现在一切都完美运作。


昨天我的代码还能正常运行,但今天却只有加上这个才能工作。感谢这个! - adbar
如果由于某种原因您无法访问这些配置设置,您可以执行System.setIn(null)。 - visch

13

虽然自认为正确的答案解决了问题,但它缺乏任何解释。

问题在于问题提出者将Kerberos/GSSAPI身份验证设置为首选(JSch默认设置)。然而,问题提出者似乎并没有真正使用/想要它,因为问题提出者声称没有为Kerberos提示指定任何用户名或密码。

这个问题可能会突然出现,当客户端电脑安装了Kerberos或服务器开始支持Kerberos时。

解决方法是从JSch首选的身份验证方法列表中删除Kerberos/GSSAPI (gssapi-with-mic):

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

1

我遇到了同样的问题。但是我意识到,如果我使用nohup命令运行jar文件,应用程序就不会被阻塞。它只是忽略提示。


0

所有答案都是正确的,我只想在此添加一下,当尝试与SFTP服务器集成时,可以使用以下方法进行Spring Integration。

所以,如果您正在使用SFTP Spring Integration,并且Kerberos的奇怪用户名和密码提示以OP询问的方式出现。

然后修改您的Spring配置(我正在使用Java Spring Integration配置,如果您使用XML配置,您可以尝试自行翻译它 - 我真的不喜欢XML配置:P):

因此,在您用作SessionFactory的bean中,您需要在配置中添加此更改:

@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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接