Java 使用JSCH、apache mina sshd或sshj打开SSH的SSH Exec通道
我在使用以下任何库JSCH、apache的sshd和sshj时遇到了一些SSH问题。当试图读取我运行的命令的输出时,它们都会阻塞执行通道,最终会超时。问题是,这种情况只发生在一些安装了OpenSSH 4.5服务器的路由器上。客户机在我安装了最新版本OpenSSH的虚拟机上工作得非常好 使用Apache MINA SSHD,客户端将:Java 使用JSCH、apache mina sshd或sshj打开SSH的SSH Exec通道,java,ssh,exec,jsch,sshd,Java,Ssh,Exec,Jsch,Sshd,我在使用以下任何库JSCH、apache的sshd和sshj时遇到了一些SSH问题。当试图读取我运行的命令的输出时,它们都会阻塞执行通道,最终会超时。问题是,这种情况只发生在一些安装了OpenSSH 4.5服务器的路由器上。客户机在我安装了最新版本OpenSSH的虚拟机上工作得非常好 使用Apache MINA SSHD,客户端将: public static void main(String[] args) throws InterruptedException, IOException {
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 exchange运行良好,也进行了身份验证,但当我尝试打开exec频道时,在虚拟盒(它工作的地方)中,我得到:
..…..…
收到SSH\u MSG\u USERAUTH\u成功
发送SSH\u MSG\u通道\u打开通道101 我从服务器收到的响应如下所示: 5b 00 00 65 00 00 00 00 00 00 80 00
5b表示SSH\u消息\u频道\u打开\u确认
00 65是客户端发送的频道(当然是101)
00是服务器分配的频道
00是初始窗口大小
00 80 00是最大数据包大小 由于初始窗口大小为0,我首先收到一条
SSH\u MSG\u CHANNEL\u window\u ADJUST
消息,然后收到一条SSH\u MSG\u CHANNEL\u SUCCESS
,这意味着请求(命令)已成功运行。包含退出状态0的SSH\u MSG\u CHANNEL\u请求
,以及包含我的ls
命令结果的SSH\u MSG\u CHANNEL\u数据
,将按预期在稍后进行交换
现在,在具有OpenSSH 4.5的路由器上,5b消息看起来略有不同:
5b 00 00 65 00 00 00 02 00 00 00 80 00
正如我们所看到的,初始窗口已设置,因此无需接收SSH\u MSG\u CHANNEL\u window\u ADJUST
。我确实收到了SSH\u MSG\u CHANNEL\u SUCCESS
,就是这样,然后它停止了。它不接收任何包含命令退出状态的SSH\u MSG\u CHANNEL\u请求
,或SSH\u MSG\u CHANNEL\u数据
,如前一示例所示。Wireshark证实了这一点
为什么会这样?如果我收到确认请求成功的SSH\u MSG\u CHANNEL\u SUCCESS
,为什么我没有收到结果
我使用的所有不同的客户端库都会出现这种情况,但它们都会超时。如果我打开一个shell
频道,一切都正常,但我不想使用交互式会话。对于有许多页面的命令,您必须阅读每一行,查看是否需要按某个键继续等
我应该放弃吗?也许OpenSSH 4.5不允许
exec
通道?为什么没有任何错误?显然,服务器上的SSH设置是我没有得到任何响应或错误的罪魁祸首
如果它有助于某人:
如果您希望调试客户端和服务器之间的ssh消息交换,以准确查看它们交换的内容,而不必捕获会话密钥并解密ssh,那么可以查看Apache Mina ssh客户端在:ClientSessionImpl:doHandleMessage(buffer)中接收的缓冲区。Ohh这是为了查看您从服务器接收到的内容,查看您发送的内容应该很简单,看看您在代码中使用的方法