使用JSCH,apache mina sshd或sshj进行Open SSH的SSH Exec通道

时间:2013-10-07 16:06:13

标签: java ssh exec jsch sshd

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

使用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交换顺利,auth也是,但当我试图打开exec频道时,在Virtual Box(它工作的地方)我得到:

  

.....
  .....
  收到SSH_MSG_USERAUTH_SUCCESS
  在频道101上发送SSH_MSG_CHANNEL_OPEN

我从服务器收到的响应如下:

  

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,这意味着请求(命令)已成功运行。 SSH_MSG_CHANNEL_REQUEST包含exit-status 0SSH_MSG_CHANNEL_DATA,其中包含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_REQUESTSSH_MSG_CHANNEL_DATA,如上例所示。 Wireshark证实了这一点。

为什么会这样?如果我收到SSH_MSG_CHANNEL_SUCCESS,确认申请成功,我怎么才收到结果?

我使用的所有不同的客户端库都会发生这种情况,不知怎的,它们会超时。如果我打开shell频道但我不想使用交互式会话,一切正常。对于包含许多页面的命令,您必须阅读每一行,看看是否需要按某些内容继续等等。

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

1 个答案:

答案 0 :(得分:2)

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

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