【问题标题】:ssh access to spring boot applicationssh 访问 Spring Boot 应用程序
【发布时间】:2015-04-28 16:48:45
【问题描述】:

在 Spring Boot 1.2.3.RELEASE 上尝试在 JDK 1.8、Windows 7 上设置 SSH。

我将 application.properties 配置为:

shell.ssh.port=2212
shell.ssh.enabled=true
shell.auth=simple
shell.auth.simple.user.name=user
shell.auth.simple.user.password=password

当应用启动并尝试通过putty访问时,出现如下异常:

java.lang.IllegalStateException: No session available
    at org.apache.sshd.common.AbstractSessionIoHandler.exceptionCaught(AbstractSessionIoHandler.java:52) ~[sshd-core-0.6.0.jar:0.6.0]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.exceptionCaught(DefaultIoFilterChain.java:697) ~[mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextExceptionCaught(DefaultIoFilterChain.java:483) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1100(DefaultIoFilterChain.java:46) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.exceptionCaught(DefaultIoFilterChain.java:791) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.IoFilterAdapter.exceptionCaught(IoFilterAdapter.java:111) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextExceptionCaught(DefaultIoFilterChain.java:483) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireExceptionCaught(DefaultIoFilterChain.java:471) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextSessionCreated(DefaultIoFilterChain.java:359) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$700(DefaultIoFilterChain.java:46) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.sessionCreated(DefaultIoFilterChain.java:771) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.IoFilterAdapter.sessionCreated(IoFilterAdapter.java:79) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextSessionCreated(DefaultIoFilterChain.java:357) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireSessionCreated(DefaultIoFilterChain.java:350) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.service.IoServiceListenerSupport.fireSessionCreated(IoServiceListenerSupport.java:211) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.polling.AbstractPollingIoProcessor.addNow(AbstractPollingIoProcessor.java:514) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.polling.AbstractPollingIoProcessor.handleNewSessions(AbstractPollingIoProcessor.java:481) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$200(AbstractPollingIoProcessor.java:67) [mina-core-2.0.2.jar:na]
    at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1071) [mina-core-2.0.2.jar:na]
    at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) [mina-core-2.0.2.jar:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_31]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_31]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_31]
Caused by: java.lang.AbstractMethodError: org.apache.sshd.common.keyprovider.AbstractKeyPairProvider.loadKeys()[Ljava/security/KeyPair;
    at org.apache.sshd.common.keyprovider.AbstractKeyPairProvider.getKeyTypes(AbstractKeyPairProvider.java:49) ~[sshd-core-0.6.0.jar:0.6.0]
    at org.apache.sshd.server.session.ServerSession.sendKexInit(ServerSession.java:331) ~[sshd-core-0.6.0.jar:0.6.0]
    at org.apache.sshd.server.session.ServerSession.<init>(ServerSession.java:92) ~[sshd-core-0.6.0.jar:0.6.0]
    at org.apache.sshd.server.session.SessionFactory.doCreateSession(SessionFactory.java:43) ~[sshd-core-0.6.0.jar:0.6.0]
    at org.apache.sshd.common.session.AbstractSessionFactory.createSession(AbstractSessionFactory.java:38) ~[sshd-core-0.6.0.jar:0.6.0]
    at org.apache.sshd.common.AbstractSessionIoHandler.sessionCreated(AbstractSessionIoHandler.java:37) ~[sshd-core-0.6.0.jar:0.6.0]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.sessionCreated(DefaultIoFilterChain.java:643) ~[mina-core-2.0.2.jar:na]
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextSessionCreated(DefaultIoFilterChain.java:357) [mina-core-2.0.2.jar:na]

这里有什么我遗漏的吗?

谢谢。


更新: 感谢您的指点。这是我的依赖树:

[INFO] +- org.springframework.boot:spring-boot-starter-actuator:jar:1.2.3.RELEASE:compile
[INFO] |  \- org.springframework.boot:spring-boot-actuator:jar:1.2.3.RELEASE:compile
[INFO] \- org.springframework.boot:spring-boot-starter-remote-shell:jar:1.2.3.RELEASE:compile
[INFO]    +- org.crashub:crash.cli:jar:1.3.1:compile
[INFO]    +- org.crashub:crash.connectors.ssh:jar:1.3.1:compile
[INFO]    |  +- org.apache.sshd:sshd-core:jar:0.6.0:compile
[INFO]    |  +- org.apache.sshd:sshd-pam:jar:0.11.0:compile
[INFO]    |  |  \- net.sf.jpam:jpam:jar:1.1:compile
[INFO]    |  +- org.bouncycastle:bcpkix-jdk15on:jar:1.51:compile
[INFO]    |  \- org.apache.mina:mina-core:jar:2.0.2:compile
[INFO]    +- org.crashub:crash.embed.spring:jar:1.3.1:compile
[INFO]    +- org.crashub:crash.plugins.cron:jar:1.3.1:compile
[INFO]    |  \- it.sauronsoftware.cron4j:cron4j:jar:2.2.5:compile
[INFO]    +- org.crashub:crash.plugins.mail:jar:1.3.1:compile
[INFO]    |  \- javax.mail:mail:jar:1.4.7:compile
[INFO]    |     \- javax.activation:activation:jar:1.1:compile
[INFO]    +- org.crashub:crash.shell:jar:1.3.1:compile
[INFO]    \- org.codehaus.groovy:groovy:jar:2.3.11:compile

所有依赖项都从 spring-boot-starter-remote-shell 传递过来。我将尝试使用手动覆盖进行修复。

【问题讨论】:

  • 你确定你可以通过 2212 端口访问 ssh 吗?
  • 我可以,因为我一尝试连接就看到我的应用程序出现异常。我在没有防火墙的情况下在本地运行所有这些。
  • 这是一个 maven 项目吗?
  • 是的,标准 Spring Boot 应用程序部署为 jar。我的一些依赖项在这里:pastebin.com/QWv5DjXi
  • 你能分享整个pom吗?

标签: spring ssh spring-boot mina


【解决方案1】:

我用 jdk1.8 开始了一个 spring boot 项目,添加了 spring-boot-starter-remote-shell maven 依赖和你的配置,试了一下,一切都很顺利。

但是java.lang.AbstractMethodError 让我怀疑是类路径问题,所以我很快在我的项目上运行了mvn dependency:tree,其中spring-boot-starter-remote-shell:jar:1.2.3.RELEASE 具有org.apache.sshd:sshd-core:jar:0.11.0 作为传递依赖项,如下所示。

[INFO] +- org.springframework.boot:spring-boot-starter-remote-shell:jar:1.2.3.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter-actuator:jar:1.2.3.RELEASE:compile
[INFO] |  |  \- org.springframework.boot:spring-boot-actuator:jar:1.2.3.RELEASE:compile
[INFO] |  +- org.crashub:crash.cli:jar:1.3.1:compile
[INFO] |  +- org.crashub:crash.connectors.ssh:jar:1.3.1:compile
[INFO] |  |  +- org.apache.sshd:sshd-core:jar:0.11.0:compile <===THIS ONE===
[INFO] |  |  +- org.apache.sshd:sshd-pam:jar:0.11.0:compile
[INFO] |  |  |  \- net.sf.jpam:jpam:jar:1.1:compile
[INFO] |  |  +- org.bouncycastle:bcprov-jdk15on:jar:1.51:compile
[INFO] |  |  +- org.bouncycastle:bcpkix-jdk15on:jar:1.51:compile
[INFO] |  |  \- org.apache.mina:mina-core:jar:2.0.7:compile
[INFO] |  +- org.crashub:crash.embed.spring:jar:1.3.1:compile
[INFO] |  +- org.crashub:crash.plugins.cron:jar:1.3.1:compile
[INFO] |  |  \- it.sauronsoftware.cron4j:cron4j:jar:2.2.5:compile
[INFO] |  +- org.crashub:crash.plugins.mail:jar:1.3.1:compile
[INFO] |  |  \- javax.mail:mail:jar:1.4:compile
[INFO] |  |     \- javax.activation:activation:jar:1.1:compile
[INFO] |  +- org.crashub:crash.shell:jar:1.3.1:compile
[INFO] |  \- org.codehaus.groovy:groovy:jar:2.3.11:compile

再次快速查看您的堆栈跟踪发现您似乎在类路径 at org.apache.sshd.common.keyprovider.AbstractKeyPairProvider.getKeyTypes(AbstractKeyPairProvider.java:49) ~[sshd-core-0.6.0.jar:0.6.0] 上有一个不同的版本,所以我接下来要做的是手动将此版本指定为 pom.xml 中的依赖项。当我重新运行应用程序并尝试通过 SSH 连接时,我遇到了与您相同的异常。

同样查看类,AbstractKeyPairProvider.loadKeys() 方法具有不同的签名,这很可能会根据 0.11.0 合约的不同而混淆实现,例如 URLKeyPairProvider

  • 0.6.0 protected abstract KeyPair[] loadKeys();
  • 0.11.0 public abstract Iterable&lt;KeyPair&gt; loadKeys();

所以,要么你也无意中添加了这个版本,要么你的一些其他依赖项引用了它,有效地隐藏了类路径上的0.11.0。在我的情况下,我启用了spring boot actuator HTTP endpoints 确认上述内容:

最后,检查您的依赖关系树并找出sshd-core 0.6.0mina-core 2.0.2 的来源并排除它们。

【讨论】:

  • 现在使用您的建议跟踪我的问题的根源。非常感谢!
  • @samyem 很高兴为您提供帮助,尽管看起来有些可疑。我检查了crash.connectors.ssh-1.3.1 继承的crash.parent-1.3.1.pom,它指定的版本是sshd-core:0.11.0mina-core:2.0.7,所以我觉得它以 0.6.0 和 2.0.2 结尾很奇怪
  • 是的,别管那棵树;我跟踪到有另一个依赖项添加了旧版本的 sshd-core。谢谢。
  • @samyem 太棒了!只是出于好奇,它是什么其他依赖项?
  • 嗯,我有一个来自另一个内部小组维护的私有模块的依赖项。现在搞定了,效果很好。
猜你喜欢
  • 2015-05-27
  • 1970-01-01
  • 2021-06-22
  • 2015-07-17
  • 1970-01-01
  • 2023-01-12
  • 2021-01-07
  • 2016-07-15
  • 2021-12-03
相关资源
最近更新 更多