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

通过Java的SFTP连接请求奇怪的身份验证,java,sftp,kerberos,jsch,Java,Sftp,Kerberos,Jsch,所以我正在编写一个小程序,需要通过SFTP连接到远程服务器,取下一个文件,然后处理该文件。我在这里通过一些答案遇到了JSch,它看起来非常适合这个任务。到目前为止,它很容易使用,而且我已经让它工作了,我只想解决一个小问题。我正在使用以下代码连接并下拉文件: JSch jsch = new JSch(); Session session = null; try { session = jsch.getSession("username", "127.0.0.

所以我正在编写一个小程序,需要通过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任务自动执行此代码,因此我不希望它暂停程序来问我这两个问题。有什么我不提供的,这样它就不会问这个问题了吗?我需要做些什么来阻止它?希望有人有一些想法。谢谢。

我想在这里发布一个答案,以防其他人遇到类似的问题。结果发现我缺少了一段代码,这段代码让一切变得不同。我只需要补充一下

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

session.connect();
现在一切都很完美。

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

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

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

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

所有答案都是正确的,我将在这里添加尝试与SFTP服务器集成时Spring集成的方法

因此,如果您正在使用SFTP Spring集成,并且Kerberos的奇怪用户和密码以OP询问的相同方式进行提示

然后修改您的Spring配置(我使用的是Java Spring集成配置,如果您使用的是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;
}
@Bean
公共会话工厂sftpSessionFactory(){
DefaultSftpSessionFactory=新的DefaultSftpSessionFactory(true);
setHost(“主机名”);
工厂设置端口(22);
factory.setUser(“用户名”);
工厂设置密码(“密码”);
工厂。setAllowUnknownKeys(真);
setSessionConfig(buildSessionProperties());
返回新的CachingSessionFactory(工厂);
}
/**
*生成JSch属性PreferredAuthentications而不使用“gssapi with mic”
*这样,它不会在每次尝试连接时都提示进行Kerberos身份验证
*到SFTP。
*/
私有属性buildSessionProperties(){
Properties sessionProperties=新属性();
setProperty(“首选身份验证”、“公钥、键盘交互、密码”);
返回sessionProperties;
}

对于后人来说,thuis可能与:奇怪的是,昨天我的代码在没有这个的情况下运行良好,而现在它只能在这个情况下运行。谢谢你!此外,如果由于某种原因无法获得这些配置设置,则只需执行System.setIn(null)