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

bwleehnv  于 2023-03-16  发布在  Java
关注(0)|答案(4)|浏览(136)

所以我正在写一个小程序,需要通过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用户名[乔治]:
乔治的Kerberos密码:
我只是按下回车键,然后程序似乎继续没有问题。然而,我需要这个代码是自动通过一个cron任务,所以我宁愿没有暂停程序问我这两个问题。有什么我没有提供它,使它不会问这一点?我需要做什么,以阻止它问?希望有人有一些想法。谢谢。

fgw7neuy

fgw7neuy1#

我想我会在这里发布一个答案,因为以防其他人最终遇到类似的问题。原来我错过了一段代码,使所有的差异。我只需要添加

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

之前

session.connect();

现在一切都很完美。

rfbsl7qr

rfbsl7qr2#

  • 虽然自我认可答案中的解决方案是正确的,但缺乏任何解释。*

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

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

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

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

fnvucqvd3#

所有答案都是正确的,我将在这里添加在尝试与SFTP服务器集成时可以为Spring Integration完成的方法。
因此,如果您正在使用SFTP Spring Integration,并且Kerberos的奇怪用户和密码以OP询问的相同方式提示。
然后修改您的Spring配置(我使用的是Java Spring Integration config,如果您使用的是XML config,您可以尝试自己翻译它-我真的不喜欢XML config:P):
因此,在用作SessionFactory的bean中,需要在config中添加以下更改:

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

wn9m85ua4#

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

相关问题