我在使用以下任何库 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 0是初始窗口大小
00 00 80 00 是最大数据包大小
因为初始窗口大小为 0,所以我先收到一条SSH_MSG_CHANNEL_WINDOW_ADJUST
消息,然后我 a SSH_MSG_CHANNEL_SUCCESS
,这意味着请求(命令)已成功运行。SSH_MSG_CHANNEL_REQUEST
包含exit-status 0
和SSH_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_REQUEST
包含命令的退出状态或 a 的内容SSH_MSG_CHANNEL_DATA
,如前面的示例所示。Wireshark 证实了这一点。
为什么会这样?SSH_MSG_CHANNEL_SUCCESS
如果我收到确认请求成功的 ,为什么我没有收到结果?
我使用的所有不同的客户端库都会发生这种情况,不知何故它们会超时。如果我打开一个shell
频道但我不想使用交互式会话,一切正常。对于有很多页面的命令,您必须阅读每一行,看看您是否需要按某些东西才能继续等。
我应该放弃吗?也许 OpenSSH 4.5 不允许exec
通道?为什么没有任何错误?