【发布时间】:2019-06-15 00:15:29
【问题描述】:
我正在尝试构建一个应用程序,该应用程序利用 Spring Boot 和 Integration 通过 SSH 从远程系统检索文件。如果我将 SessionFactory 的 allowUnknownKeys 属性设置为 true,它就可以正常工作。
@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
factory.setHost("x");
factory.setPort(22);
factory.setUser("x");
factory.setPassword("x");
factory.setAllowUnknownKeys(true);
// factory.setHostKeyAlias("x");
// factory.setKnownHosts(
// System.getProperty("user.home") + File.separator + ".ssh" + File.separator + "known_hosts");
return new CachingSessionFactory<LsEntry>(factory);
}
但是,如果我将allowUnknownKeys 设置为 false 并取消注释掉上面 sn-p 中的行,则无法建立连接。
2019-01-21 08:55:05.536 ERROR 10680 --- [ask-scheduler-1] osintegration.handler.LoggingHandler : org.springframework.messaging.MessagingException: 将“sftp-outbound”同步到本地目录;嵌套异常是 org.springframework.messaging.MessagingException: 无法执行 会议;嵌套异常是 org.springframework.integration.util.PoolItemNotAvailableException: 获取池项失败
根本原因是无法建立“主机的真实性”,并希望我授予建立连接的权限。我明白这一点。但是,我的问题是为什么它没有正确读取/解析 known_hosts 文件?我传递给它的那个是自动生成的,当我通过命令行 ssh 进入系统时它工作正常。使用断点,我已经验证应用程序正在查找并读取正确的known_hosts 文件。我可以使用完全相同的凭据并通过 bash shell 进行连接,而无需任何有关主机真实性的提示。
我错过了什么?
谢谢。
【问题讨论】:
-
你知道Java应用程序是否有正确的权限来访问
known_hosts文件吗?在大多数 *nix 环境中,.ssh目录和其中的任何文件的文件权限都受到严格限制。 -
有趣;我刚刚测试了 mac 到 mac 并遇到了同样的问题 - 我调试了 JSCH 客户端,它找到了密钥,但类型不匹配 - 在我的 known_hosts 文件中,类型是
ecdsa-sha2-nistp256(类型 3)但是密钥交换返回的密钥报告为类型 2 (ssh-rsa)。 -
在this answer 中找到了解决方法。
标签: spring-boot spring-integration jsch openssh