【问题标题】:SSH Exec channel for Open SSH using JSCH, apache mina sshd or sshjSSH Exec 通道,用于使用 JSCH、apache mina sshd 或 sshj 打开 SSH
【发布时间】:2013-10-14 07:14:23
【问题描述】:

我在使用以下库 JSCH、来自 apache 的 sshd 和 sshj 时遇到了一些 SSH 问题。当试图读取我运行的命令的输出时,它们都会阻塞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 交换进行得很顺利,身份验证也很顺利,但是当我尝试在 Virtual Box(它工作的地方)中打开 exec 通道时,我得到:

.....
.....
收到 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,表示请求(命令)运行成功。包含exit-status 0SSH_MSG_CHANNEL_REQUEST 和包含我的ls 命令结果的SSH_MSG_CHANNEL_DATA 稍后按预期交换。

现在在具有 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 频道?为什么没有错误?

【问题讨论】:

    标签: java ssh exec jsch sshd


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 2016-12-10
      • 1970-01-01
      • 2013-06-03
      • 2016-09-17
      相关资源
      最近更新 更多