我遇到了一些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 0
和SSH_MSG_CHANNEL_DATA
的SSH_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
频道?为什么没有任何错误?