2013-10-07 180 views
1

我遇到了一些SSH问题,使用任何以下库JSCH,从apache和sshj sshd。尝试从我运行的命令中读取输出时,它们都会在exec channel上阻塞,并且最终会超时。问题是,这只发生在安装有OpenSSH 4.5服务器的某些路由器上。客户端在我安装最新版本的OpenSSH的虚拟框中完美工作。使用JSCH,apache mina sshd或sshj打开SSH的SSH执行通道

使用Apache MINA SSHD客户端将是:

public static void main(String[] args) throws InterruptedException, IOException { 
    String cmdToRun = "ls"; 
    SshClient client = SshClient.setUpDefaultClient(); 
    client.start(); 
    ClientSession session = client.connect("127.0.0.1", 22).await().getSession(); 
    session.authPassword("sshUser", "sshPass").await().isSuccess(); 
    ChannelExec channelExec = session.createExecChannel(cmdToRun); 
    channelExec.setOut(System.out);   
    channelExec.open(); 
    channelExec.waitFor(ClientChannel.CLOSED, 0); 
    channelExec.close(true); 
    client.stop(); 
} 

我调试它在Eclipse中使用的是Wireshark我观察传输的消息和接收的消息,一切似乎罚款。 DH交换顺利,权威性也,但是当我试图打开EXEC通道,在虚拟盒(它的工作),我得到:

.....
.....
接收SSH_MSG_USERAUTH_SUCCESS
发送SSH_MSG_CHANNEL_OPEN上通道101

,我从服务器接收的响应看起来像:

5B 00 00 00 65 00 00 00 00 00 00 00 00 00 00 80 00
5B装置SSH_MSG_CHANNEL_OPEN_CONFIRMATION
00 00 00 65是客户端发送的信道(当然101)
00 00 00 00是服务器分配的信道
00 00 00 00是初始窗口大小
00 00 80 00是最大数据包大小

由于初始窗口大小为0,我第一接收SSH_MSG_CHANNEL_WINDOW_ADJUST消息,然后我一个SSH_MSG_CHANNEL_SUCCESS,这意味着该请求(该命令)已成功运行。包含exit-status 0SSH_MSG_CHANNEL_DATASSH_MSG_CHANNEL_REQUEST(其中包含我的ls命令的结果)将在稍后根据预期进行交换。

现在拥有的OpenSSH 4.5 5B消息在路由器上看起来略有不同:

5B 00 00 00 65 00 00 00 00 00 02 00 00 00 00 80 00

我们可以看到初始窗口被设置,所以没有必要收到SSH_MSG_CHANNEL_WINDOW_ADJUST。我确实收到SSH_MSG_CHANNEL_SUCCESS,就是这样,然后停止。它没有收到任何包含命令退出状态的SSH_MSG_CHANNEL_REQUEST,或SSH_MSG_CHANNEL_DATA,如前面的示例所示。 Wireshark证实了它。

这是怎么发生的?如果我收到SSH_MSG_CHANNEL_SUCCESS,如何确认请求是否成功,我怎么没有收到结果?

这发生在我使用的所有不同的客户端库上,不知何故它们超时。如果我打开shell频道,但是我不想使用互动式会话,则所有工作都正常。对于有很多页面的命令,你必须阅读每一行,看看你是否需要按某些东西继续等等。

我应该放弃吗?也许OpenSSH 4.5不允许exec频道?为什么没有任何错误?

回答

1

显然,服务器上的SSH设置是我没有得到任何响应或错误的罪魁祸首。

如果它可以帮助某人: 如果您想要调试客户端和服务器之间的ssh消息交换以准确查看它们交换的内容,而不必捕获会话密钥并解密ssh,则可以查看缓冲区您将收到:ClientSessionImpl:Apache Mina SSH客户端的doHandleMessage(缓冲区)。哦,这是看你从服务器收到什么,看看你发送的内容应该很容易,看看你在代码中使用的方法。