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