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

car*_*ian 42 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();
    }
Run Code Online (Sandbox Code Playgroud)

所以这有效,我得到了文件.我在linux服务器上运行此代码,当我运行代码时,JSch会询问我的Kerberos用户名和密码.看起来像:

Kerberos用户名[george]:

george的Kerberos密码:

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

car*_*ian 81

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

session.setConfig("PreferredAuthentications", 
                  "publickey,keyboard-interactive,password");
Run Code Online (Sandbox Code Playgroud)

之前

session.connect();
Run Code Online (Sandbox Code Playgroud)

现在一切都很完美.


Mar*_*ryl 11

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

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

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

session.setConfig(
    "PreferredAuthentications", 
    "publickey,keyboard-interactive,password");
Run Code Online (Sandbox Code Playgroud)