【问题标题】:Multiple SSH connections not allowed in an sbt sessionsbt 会话中不允许多个 SSH 连接
【发布时间】:2018-01-04 12:52:09
【问题描述】:

在一个多模块 Scala 项目中,我正在运行几个集成测试,其中我使用 scala-ssh (v. 0.8) 通过 SSH 连接到远程机器并从那里传输文件。

如果我在sbt 会话中运行集成测试一次,一切都会按预期运行 - 我可以连接到机器并下载任何文件。 Scala代码的相关位是:

private lazy val fileInventory: AnsibleYamlFileInventory = {
    val inventory = SSH(ansibleHost, HostResourceConfig()) { client =>
      client.fileTransfer {
        scp =>
          val tmpLocalFile = Files.createTempFile("inventory", ".yaml")
          scp.download(remoteYamlInventoryFile, tmpLocalFile.toAbsolutePath.toString)
          new AnsibleYamlFileInventory(tmpLocalFile)
      }
    }

    inventory.fold(s => throw new RuntimeException(s), identity)
}

如果我尝试在同一个 sbt 会话中运行同一个测试(或另一个集成测试),就会出现问题。我收到与here 提到的相同的错误消息:

    14:32:11.751 [reader] ERROR net.schmizz.sshj.transport.TransportImpl - Dying because - {}
net.schmizz.sshj.common.SSHRuntimeException: null
        at net.schmizz.sshj.common.Buffer.readPublicKey(Buffer.java:432)
        at net.schmizz.sshj.transport.kex.AbstractDHG.next(AbstractDHG.java:75)
        at net.schmizz.sshj.transport.KeyExchanger.handle(KeyExchanger.java:367)
        at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:509)
        at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:107)
        at net.schmizz.sshj.transport.Decoder.received(Decoder.java:175)
        at net.schmizz.sshj.transport.Reader.run(Reader.java:60)
Caused by: java.security.GeneralSecurityException: java.security.spec.InvalidKeySpecException: key spec not recognised
        at net.schmizz.sshj.common.KeyType$3.readPubKeyFromBuffer(KeyType.java:156)
        at net.schmizz.sshj.common.Buffer.readPublicKey(Buffer.java:430)
        ... 6 common frames omitted
Caused by: java.security.spec.InvalidKeySpecException: key spec not recognised
        at org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic(Unknown Source)
        at org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi.engineGeneratePublic(Unknown Source)
        at java.security.KeyFactory.generatePublic(KeyFactory.java:334)
        at net.schmizz.sshj.common.KeyType$3.readPubKeyFromBuffer(KeyType.java:154)
        ... 7 common frames omitted

如果我终止 sbt 会话并重新启动另一个会话,则在问题再次发生之前,我只能再次运行一个集成测试。

我已经按照建议安装了 JCE 8 文件。所以,我想知道我需要修复什么才能让多个测试成功运行,他们可以一个接一个地通过 ssh 连接到远程机器。

【问题讨论】:

  • edit 你的问题包括你正在运行的代码和你得到的确切错误,包括堆栈跟踪。不要链接到某个 github 页面,让人们猜测你遇到了什么错误。
  • @Kenster,感谢您的评论 - 我更新了问题。

标签: scala ssh sbt scalatest


【解决方案1】:

经过一些调试,我发现问题是由于BouncyCastle,在后续测试中仍然注册为JCE提供者并导致问题。这在堆栈跟踪中显示为:

INFO net.schmizz.sshj.common.SecurityUtils - BouncyCastle already registered as a JCE provider

我决定添加security provider dynamically 并在测试完成后将其删除。

def doTests(): Unit = {

  import org.bouncycastle.jce.provider.BouncyCastleProvider
  import java.security.Security

  Security.addProvider(new BouncyCastleProvider)

  "Some test" should {
    "be BLABLA" in {
      assert(...) // some test
    }
  }

  "Some other test" should {
    "be BLABLABLA" in {
      assert(...) // some other test
    }
  }

  Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME)
}

【讨论】:

    猜你喜欢
    • 2017-06-01
    • 1970-01-01
    • 2018-09-10
    • 2014-07-20
    • 2020-07-02
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多