麻烦解释一下这段代码每一句的作用public String execCmdErrContent(String command) throws Exception { // if (session == null || channel == null || channelExec == null) { // throw new Exception(DONOT_INIT_ERROR_MSG); // } // 打开执行shell指令的通道 Channel channel = session.openChannel("exec"); ChannelExec channelExec = (ChannelExec) channel; channelExec.setCommand(command); channel.setInputStream(null); ByteArrayOutputStream err = new ByteArrayOutputStream(); channelExec.setErrStream(err); channel.connect(); StringBuilder sb = new StringBuilder(16); try (InputStream in = channelExec.getErrStream(); InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(isr)) { String buffer; while ((buffer = reader.readLine()) != null) { sb.append("\n").append(buffer); } //2023-02-21 关闭流 IoUtil.close(reader); IoUtil.close(isr); IoUtil.close(in); IoUtil.close(err); if(StrUtil.contains(sb.toString(), "没有那个文件或目录")){ return ""; }else{ return sb.toString(); } }finally { if (channelExec != null && channelExec.isConnected()) { channelExec.disconnect(); } if ( channel != null && channel.isConnected()) { channel.disconnect(); } } }
时间: 2024-03-18 18:43:58 浏览: 78
这段代码是一个方法,用于执行 Shell 命令并返回错误信息。下面是每句代码的作用:
1. `public String execCmdErrContent(String command) throws Exception {`:定义名为 `execCmdErrContent` 的公共方法,接受一个字符串类型的参数 `command`,并抛出异常。
2. `Channel channel = session.openChannel("exec");`:打开一个用于执行 Shell 命令的通道。
3. `ChannelExec channelExec = (ChannelExec) channel;`:将通道转换为 `ChannelExec` 类型,以便执行命令。
4. `channelExec.setCommand(command);`:设置要执行的命令。
5. `channel.setInputStream(null);`:设置通道的输入流为空,因为我们不需要从通道读取任何内容。
6. `ByteArrayOutputStream err = new ByteArrayOutputStream();`:创建一个字节数组输出流,用于保存错误信息。
7. `channelExec.setErrStream(err);`:将错误信息输出到字节数组输出流中。
8. `channel.connect();`:连接通道。
9. `StringBuilder sb = new StringBuilder(16);`:创建一个字符串构建器,用于保存错误信息。
10. `try (InputStream in = channelExec.getErrStream(); InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(isr)) {`:使用 try-with-resources 语句创建输入流、转换流和缓冲读取器。
11. `String buffer; while ((buffer = reader.readLine()) != null) { sb.append("\n").append(buffer); }`:读取输入流中的每一行数据,并将其添加到字符串构建器中。
12. `if(StrUtil.contains(sb.toString(), "没有那个文件或目录")){ return ""; }else{ return sb.toString(); }`:如果错误信息中包含指定的字符串,则返回空字符串,否则返回错误信息。
13. `} finally { if (channelExec != null && channelExec.isConnected()) { channelExec.disconnect(); } if ( channel != null && channel.isConnected()) { channel.disconnect(); } }`:无论是否出现异常,都会执行的 finally 块。在这里,关闭通道和流,以释放资源。
阅读全文