通过Java连接SFTP请求奇怪的身份验证

时间:2012-06-04 13:14:15

标签: java sftp kerberos jsch

所以我正在编写一个需要通过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]:

乔治的Kerberos密码:

我刚刚输入两个问题,然后程序似乎继续没有问题。但是我需要通过cron任务自动执行此代码,所以我宁愿不让它暂停程序来问我这两个问题。有什么我不提供它,所以它不会问这个?我需要做些什么来阻止它问?希望有人有一些想法。感谢。

3 个答案:

答案 0 :(得分:76)

以为我会在这里发布一个答案,因为如果其他人最终遇到类似的问题。事实证明,我错过了一段能让一切变得与众不同的代码。我只需要添加

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

session.connect();

现在一切都很完美。

答案 1 :(得分:8)

虽然自我接受的答案中的解决方案是正确的,但它没有任何解释。

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

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

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

答案 2 :(得分:0)

所有答案都是正确的,我将在此处添加尝试与SFTP服务器集成时进行Spring Integration的方式。

因此,如果您使用的是SFTP Spring Integration,并且Kerberos发出的奇怪用户名和密码的提示方式与OP的要求相同。

然后修改您的Spring配置(我使用的是Java Spring Integration配置,如果您使用的是XML配置,则可以尝试自行翻译-我真的不喜欢XML config: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;
}