sbt 会话中不允许多个 SSH 连接
Multiple SSH connections not allowed in an sbt session
在一个多模块 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.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.readPubKeyFromBuffer(KeyType.java:154)
... 7 common frames omitted
如果我终止那个 sbt
会话并重新启动另一个会话,我可以再次 运行 在问题再次出现之前只进行一次集成测试。
我已经按照提示安装了JCE 8文件。所以,我想知道我需要修复什么才能成功获得多个测试 运行ning,他们可以一个接一个地通过 ssh 连接到远程机器。
经过一些调试,我发现问题是由于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)
}
在一个多模块 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.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.readPubKeyFromBuffer(KeyType.java:154)
... 7 common frames omitted
如果我终止那个 sbt
会话并重新启动另一个会话,我可以再次 运行 在问题再次出现之前只进行一次集成测试。
我已经按照提示安装了JCE 8文件。所以,我想知道我需要修复什么才能成功获得多个测试 运行ning,他们可以一个接一个地通过 ssh 连接到远程机器。
经过一些调试,我发现问题是由于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)
}