如何在 JSch 中检测错误(如 "Directory not found"、"TNS listener lost contact" 等)?
How to detect error (as in "Directory not found", "TNS listener lost contact", etc) in JSch?
我需要在使用 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();
}
有什么方法可以让我也收到错误消息吗?
提前致谢。
错误通常写入错误输出。您可以使用 getErrStream
.
读取错误输出
请注意,您需要并行读取标准输出(getInputStream
)和错误输出,而不是顺序读取。我的意思是你不能只克隆你的 while
循环,你有 getInputStream
,getErrStream
。您需要有一个循环,从两个循环中读取(读取一个中可用的内容,读取第二个中可用的内容,等待新数据并重复)
当你先读一个然后读另一个时,如果后者输出很大,它的输出缓冲区变满,命令停止,永远不会完成。因此,如果您一直等待第一个输出关闭,就会与服务器发生死锁。
请注意,"Auth failed"不是命令输出的错误。这是 JSch 库抛出的异常。所以它与你的代码无关。
如果您有 ChannelExec
来调用远程命令,您可以使用 channel.getExitStatus()
在失败情况下获取(非空)数字执行代码(只要 shell 和您使用的命令都表现良好)。
我需要在使用 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();
}
有什么方法可以让我也收到错误消息吗?
提前致谢。
错误通常写入错误输出。您可以使用 getErrStream
.
请注意,您需要并行读取标准输出(getInputStream
)和错误输出,而不是顺序读取。我的意思是你不能只克隆你的 while
循环,你有 getInputStream
,getErrStream
。您需要有一个循环,从两个循环中读取(读取一个中可用的内容,读取第二个中可用的内容,等待新数据并重复)
当你先读一个然后读另一个时,如果后者输出很大,它的输出缓冲区变满,命令停止,永远不会完成。因此,如果您一直等待第一个输出关闭,就会与服务器发生死锁。
请注意,"Auth failed"不是命令输出的错误。这是 JSch 库抛出的异常。所以它与你的代码无关。
如果您有 ChannelExec
来调用远程命令,您可以使用 channel.getExitStatus()
在失败情况下获取(非空)数字执行代码(只要 shell 和您使用的命令都表现良好)。