当前位置: 首页 > 面试题库 >

永不结束使用jSch读取服务器响应

胡俊贤
2023-03-14
问题内容

我正在尝试通过jSch0.1.49库连接在Unix服务器上运行命令。我浏览了jSch甚至http://sourceforge.net/apps/mediawiki/jsch/index.php?title=Official_examples提供的示例

我能够从服务器读取响应并将其打印到控制台,但循环* 永无止境 * g。我怀疑为什么Channele一旦完成从服务器读取响应就没有关闭。

while (true) {
    while (inputStream.available() > 0) {
        int i = inputStream.read(buffer, 0, 1024);
        if (i < 0) {
            break;
        }
        System.out.print(new String(buffer, 0, i));//It is printing the response to console
    }
    System.out.println("done");// It is printing continuously infinite times

    if (channel.isClosed()) {//It is never closed 
        System.out.println("exit-status: " + channel.getExitStatus());
        break;
    }
    try{Thread.sleep(1000);}catch(Exception ee){}
}

问题答案:

没有输入时,通道不会自行关闭。阅读完所有数据后,请尝试自己关闭它。

while (true) {
    while (inputStream.available() > 0) {
        int i = inputStream.read(buffer, 0, 1024);
        if (i < 0) {
            break;
        }
        System.out.print(new String(buffer, 0, i));//It is printing the response to console
    }
    System.out.println("done");

    channel.close();  // this closes the jsch channel

    if (channel.isClosed()) {
        System.out.println("exit-status: " + channel.getExitStatus());
        break;
    }
    try{Thread.sleep(1000);}catch(Exception ee){}
}

您唯一要使用不会手动关闭通道的循环是在您收到用户的交互式键盘输入时。然后,当用户执行“退出”操作时,该操作将更改通道的“
getExitStatus”。如果您的循环为while(channel.getExitStatus()== -1),则当用户退出时循环将退出。
在检测到退出状态后,您仍然需要断开通道并自己进行会话

它没有在示例页面上列出,但是JSCH在其站点上托管了一个交互式键盘演示。
http://www.jcraft.com/jsch/examples/UserAuthKI.java

即使是我的演示程序,我用来连接到AIX系统而不更改任何代码的演示程序,在退出Shell时也不会关闭!

在远程会话中键入“退出”后,我必须添加以下代码才能使其正确退出:

     channel.connect();

     // My added code begins here
     while (channel.getExitStatus() == -1){
        try{Thread.sleep(1000);}catch(Exception e){System.out.println(e);}
     }

     channel.disconnect();
     session.disconnect();
     // My Added code ends here

   }
   catch(Exception e){
     System.out.println(e);
   }
}


 类似资料:
  • 问题内容: 我下载了新的JSch 0.1.53库, 并且JSch(sftp)下载任务不再起作用。此版本因函数抛出错误而失败。 我的旧jsch.jar(2011-10-06)在同一主机上运行正常,也许我缺少新的配置道具? 这是一个广泛的JSch日志记录,指示发生了什么。 我还有一个非常旧的Jsch.jar(2011-10-06),其中下载任务正常运行,这是一个日志。我要升级的原因是文件传输速度非常慢

  • 这将返回有效用户的调用状态。例如,如果用户是有效的,并且存在状态,则以纯文本形式返回“Active”。如果没有有效用户,则返回#1005的错误代码 我可以像这样添加自定义转换器工厂(在web上找到) 但我没看到有什么不同。此外,它还可以很好地将JSON伪装成普通文本,并破坏所有现有服务。有没有更好的方法来处理这种情况?我想过为纯文本提供单独的改型实例,虽然有点脏。你还有其他的建议/解决办法吗?

  • 问题内容: 我正在连接到远程服务器SSH服务器,并尝试获取特定路径中的文件列表,我能够获取该路径中的文件列表,但是它们的格式不可读,可以有人帮忙吗 这是控制台输出 问题答案: 这些是ANSI转义码,通常由终端客户端解释以漂亮地[彩色]打印输出。 如果服务器配置正确,则只有在使用交互式终端时才能获得这些信息。换句话说,如果您为会话请求了伪终端(如果要使会话自动化,则不应该这样做)。 如果使用了“ s

  • 我们每天都使用jsch-0.1.53.jar通过SFTP获取文件,但是运行了几年后,它现在停止工作了。我想服务器管理员可能已经升级了服务器软件。 相关代码(JAVA 1.7)不包含任何意外: 最后一行抛出“java.io.IOException:io流读取结束”,所以我想服务器会关闭连接。 我升级到了jsch 0.1.55(尽管下面的日志声称它是0.1.54),但这并没有改变任何事情。 jsch的

  • 我刚刚在我的电脑里安装了Debian8。我尝试设置Android-Studio(1.4): 下载自https://developer.android.com/sdk/index.html 解压缩到/opt 下载了SDK和所有内容 当我尝试创建一个新的项目,并且如果我打开一个旧的项目,它就会陷入构建(我让它运行超过1个小时,它永远不会结束)。在控制台中,它始终打印: 我试过重新安装和重新启动,但什么

  • 我正在编写一个应用程序,其中要求将文件从远程SFTP服务器传输到本地计算机,反之亦然。在文件传输过程中,我想确保没有数据包在传输过程中丢失和损坏。因此,我们的想法是在传输之前对远程文件(位于sftp服务器中)运行MD5校验和,然后启动传输过程。传输完成后,在本地文件上运行md5并比较两个校验和。 我正在使用JSCH连接到sftp服务器,代码是java。但是我不知道如何在SFTP服务器中的远程文件上