Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JSCH、apache mina sshd或sshj打开SSH的SSH Exec通道_Java_Ssh_Exec_Jsch_Sshd - Fatal编程技术网

Java 使用JSCH、apache mina sshd或sshj打开SSH的SSH Exec通道

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 {

我在使用以下任何库JSCH、apache的sshd和sshj时遇到了一些SSH问题。当试图读取我运行的命令的输出时,它们都会阻塞执行通道,最终会超时。问题是,这种情况只发生在一些安装了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 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这是为了查看您从服务器接收到的内容,查看您发送的内容应该很简单,看看您在代码中使用的方法