通过 Java 的 SFTP 连接,要求进行奇怪的身份验证

2022-08-31 22:25:00

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

乔治的克贝罗斯密码:

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


答案 1

以为我会在这里发布一个答案,因为以防其他人最终遇到类似的问题。事实证明,我缺少一段使一切变得不同的代码。我只需要添加

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

以前

session.connect();

现在一切都很完美。


答案 2

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

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

当 Kerberos 安装在客户端 PC 上或服务器开始支持 Kerberos 时,此问题可能会自发出现。

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

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

推荐