alexmherrmann opened a new issue, #426:
URL: https://github.com/apache/mina-sshd/issues/426

   ### Version
   
   2.11.0
   
   ### Bug description
   
   I have not found any examples of what I am trying to do in official 
documentation.
   
   I have two tests here (in kotlin):
   
   ```kotlin
   package minatest
   import com.google.common.truth.Truth
   import org.apache.sshd.client.SshClient
   import org.junit.jupiter.api.MethodOrderer.OrderAnnotation
   import org.junit.jupiter.api.Order
   import org.junit.jupiter.api.Test
   import org.junit.jupiter.api.TestMethodOrder
   import org.junit.jupiter.api.Timeout
   import org.slf4j.LoggerFactory
   import org.springframework.beans.factory.annotation.Autowired
   import org.springframework.boot.test.context.SpringBootTest
   import org.springframework.test.context.ActiveProfiles
   import reactor.kotlin.test.test
   import java.time.Duration.ofSeconds
   import java.util.concurrent.CountDownLatch
   import java.util.concurrent.TimeUnit.SECONDS
   
        val client = SshClient.setUpDefaultClient().apply {
                start()
        }
   
        @Test
        fun sanityTest() {
                val instance = 
requestor.getExistingInstance(existingInstance).block(ofSeconds(5))
   
                val ipv4 = instance.getPublicIpv4Address()
   
                val connection = client.connect(
                        "root",
                        ipv4,
                        22
                ).verify(ofSeconds(5))
   
                val output = connection
                        .session
                        .run {
                                auth().verify(ofSeconds(5))
                                executeRemoteCommand("uptime")
                        }
   
                logger.info("Output: $output")
   
        }
   
        @Test
        fun secondSanityNowAsync() {
                val instance = requestor
                        .getExistingInstance(existingInstance)
                        .block(ofSeconds(10))
                val connected = client.connect("root", 
instance.getPublicIpv4Address(), 22)
   
                val blocker = CountDownLatch(1)
                connected.addListener { conn ->
                        logger.info("Connected: $conn")
                        val sesh = conn.session
                        val auth = sesh.auth().addListener { authed ->
                                conn.verify(0)
                                authed.verify(0)
                                logger.info("Authed: $authed")
                                val output = sesh.executeRemoteCommand("uptime")
                                logger.info("Output: $output")
                                Truth.assertThat(output).contains("load")
                                // NOTIFY OF COMPLETION
                                blocker.countDown()
                        }
                }
   
                assert(blocker.await(10, SECONDS))
   
        }
   ```
   
   The synchronous one works just fine. I call verify twice and then I am set 
up to go. However I'm going for an async architecture and would rather do 
something like the second as it will eventually be integrated into a project 
reactor application.
   
   The first one runs just fine, the second one hangs forever on the 
`connected.session.executeRemoteCommand(...)`. Setting a breakpoint it makes it 
all the way to the second listener (i.e. I get the "Authed: ..." log message) 
and then never makes it to the "Output: ".
   
   
   ### Actual behavior
   
   The test fails to complete in any amount of time.
   
   ### Expected behavior
   
   The `executeRemoteCommand` should execute
   
   
   ### Relevant log output
   
   ```Shell
   From the run where it hangs:
   
   2023-10-24T14:27:51,113 DEBUG [sshd-SshClient[15fdd1f2]-nio2-thread-9] 
o.a.s.c.s.AbstractClientSession: 
createExecChannel(ClientSessionImpl[root@/142.93.54.117:22])[uptime] created 
id=0 - PTY=null
   2023-10-24T14:27:51,113 DEBUG [sshd-SshClient[15fdd1f2]-nio2-thread-9] 
o.a.s.c.c.AbstractClientChannel: open(ChannelExec[id=0, 
recipient=-1]-ClientSessionImpl[root@/142.93.54.117:22]) Send 
SSH_MSG_CHANNEL_OPEN - type=session
   2023-10-24T14:27:51,113 DEBUG [sshd-SshClient[15fdd1f2]-nio2-thread-9] 
o.a.s.c.s.h.AbstractSession: encode(ClientSessionImpl[root@/142.93.54.117:22]) 
packet #7 sending command=90[SSH_MSG_CHANNEL_OPEN] len=24
   2023-10-24T14:27:51,113 DEBUG [sshd-SshClient[15fdd1f2]-nio2-thread-9] 
o.a.s.c.i.n.Nio2Session: writeBuffer(Nio2Session[local=/192.168.86.247:63735, 
remote=/142.93.54.117:22]) writing 60 bytes
   
   java.lang.AssertionError: Assertion failed (on the countdownlatch block)
   
   The last few logs from when it runs successfully:
   
   2023-10-24T14:15:39,701 DEBUG [main] o.a.s.c.s.AbstractClientSession: 
createExecChannel(ClientSessionImpl[root@/142.93.54.117:22])[uptime] created 
id=0 - PTY=null
   2023-10-24T14:15:39,702 DEBUG [main] o.a.s.c.c.AbstractClientChannel: 
open(ChannelExec[id=0, recipient=-1]-ClientSessionImpl[root@/142.93.54.117:22]) 
Send SSH_MSG_CHANNEL_OPEN - type=session
   2023-10-24T14:15:39,702 DEBUG [main] o.a.s.c.s.h.AbstractSession: 
encode(ClientSessionImpl[root@/142.93.54.117:22]) packet #7 sending 
command=90[SSH_MSG_CHANNEL_OPEN] len=24
   2023-10-24T14:15:39,702 DEBUG [main] o.a.s.c.i.n.Nio2Session: 
writeBuffer(Nio2Session[local=/192.168.86.247:63598, remote=/142.93.54.117:22]) 
writing 60 bytes
   2023-10-24T14:15:40,374 DEBUG [sshd-SshClient[15fb7a32]-nio2-thread-11] 
o.a.s.c.s.h.AbstractSession: 
doHandleMessage(ClientSessionImpl[root@/142.93.54.117:22]) process #8 
SSH_MSG_GLOBAL_REQUEST
   2023-10-24T14:15:40,375 DEBUG [sshd-SshClient[15fb7a32]-nio2-thread-11] 
o.a.s.c.s.h.AbstractConnectionService: 
globalRequest(ClientConnectionService[ClientSessionImpl[root@/142.93.54.117:22]])
 received SSH_MSG_GLOBAL_REQUEST hostkeys...@openssh.com want-reply=false
   ```
   
   
   ### Other information
   
   _No response_


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscr...@mina.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@mina.apache.org
For additional commands, e-mail: dev-h...@mina.apache.org

Reply via email to