【问题标题】:How to detect error (as in "Directory not found", "TNS listener lost contact", etc) in JSch?如何在 JSch 中检测错误(如“找不到目录”、“TNS 侦听器失去联系”等)?
【发布时间】:2016-09-28 10:33:55
【问题描述】:

我需要在使用 JSch 触发任何命令时收到错误消息。

目前我正在使用下面的代码来获取tail 命令的输出,但是如果文件不存在,我应该得到错误作为输出(我没有得到)。

public String getOutput() {
    LOGGER.debug("[getOutput]");
    StringBuffer output = new StringBuffer();
    InputStream in = null;
    if (channel != null && channel.isConnected()) {
        try {
            in = channel.getInputStream();

            byte[] tmp = new byte[1024];
            while (true) {
                LOGGER.debug("[getOutput] in while");
                while (in.available() > 0) {
                    LOGGER.debug(in.available());
                    int i = in.read(tmp, 0, 1024);
                    if (i < 0)
                        break;
                    output.append(new String(tmp, 0, i));
                }
                if (channel.isClosed()) {
                    LOGGER.debug("[getOutput] Channel is closed, so breaking while loop");
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            channel.disconnect();
        }
    } else {
        System.out.println("Channel is disconnected");
    }

    return output.toString();
}

有什么方法可以让我也收到错误消息吗?

提前致谢。

【问题讨论】:

    标签: java linux jsch stderr


    【解决方案1】:

    错误通常被写入错误输出。您可以使用getErrStream 读取错误输出。

    请注意,您需要并行读取标准输出(getInputStream)和错误输出,而不是按顺序读取。我的意思是你不能只克隆你的while循环,你有getInputStreamgetErrStream。您需要有一个循环,从两者中读取(读取一个中可用的内容,第二个中读取可用的内容,等待新数据并重复)

    当您读取第一个然后另一个时,如果后者的输出很大,则其输出缓冲区已满,命令停止,永远不会完成。因此,如果您一直等待第一个输出关闭,您将与服务器陷入僵局。


    注意“Auth failed”并不是命令输出的错误。这是 JSch 库抛出的异常。所以它与你的代码无关。

    【讨论】:

    • 我的意思是你不能只复制你的 while 循环你有 getInputStreamgetErrStream。您需要有一个循环,从两者中读取(读取一个中可用的内容,读取第二个中可用的内容,等待新数据并重复)。
    【解决方案2】:

    如果您有ChannelExec 来调用远程命令,您可以使用channel.getExitStatus() 在失败情况下获取(非空)数字执行代码(只要您使用的shell 和命令表现良好) .

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 2021-05-23
      • 1970-01-01
      • 2016-09-02
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      相关资源
      最近更新 更多