麻烦解释一下这段代码每一句的作用public static String execCmd(Session session,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("source /etc/profile && source ~/.bash_profile && source ~/.bashrc && adb devices && locale charmap"); channelExec.setCommand(command); channel.setInputStream(null); channelExec.setErrStream(System.err); // channel.setXForwarding(); channel.connect(); StringBuilder sb = new StringBuilder(16); try (InputStream in = channelExec.getInputStream(); 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); return sb.toString(); }finally { if (channelExec.isConnected()) { channelExec.disconnect(); } if (channel.isConnected()) { channel.disconnect(); } } }
时间: 2024-02-14 19:14:19 浏览: 216
这段代码的作用是通过SSH连接到远程服务器,并在服务器上执行一个shell命令,然后将命令的输出结果返回到本地。
具体每一句代码的作用如下:
1. `public static String execCmd(Session session,String command) throws Exception {` :定义一个公共静态方法,用于执行指定的命令。
2. `Channel channel = session.openChannel("exec");` :用会话对象打开一个执行shell指令的通道。
3. `ChannelExec channelExec = (ChannelExec) channel;` :将通道对象转换为执行通道对象。
4. `channelExec.setCommand("source /etc/profile && source ~/.bash_profile && source ~/.bashrc && adb devices && locale charmap");` :设置执行通道对象的命令,此处是一些初始化命令,用于设置环境变量、查看adb连接设备等。
5. `channelExec.setCommand(command);` :设置执行通道对象的命令,此处是要执行的具体命令。
6. `channel.setInputStream(null);` :设置通道的输入流为null,表示不需要从本地向远程服务器发送数据。
7. `channelExec.setErrStream(System.err);` :将执行通道对象的错误流输出到标准错误流中。
8. `channel.connect();` :连接到远程服务器。
9. `StringBuilder sb = new StringBuilder(16);` :创建一个StringBuilder对象,用于存储执行命令的输出结果。
10. `try (InputStream in = channelExec.getInputStream();` :通过执行通道对象的输入流获取远程服务器上命令的输出流。
11. `InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8);` :将输入流转换为字符流,并设置字符编码为UTF-8。
12. `BufferedReader reader = new BufferedReader(isr)) {` :创建一个缓冲字符输入流,并将字符输入流包装进去。
13. `String buffer;` :定义一个字符串变量,用于存储每次读取的字符流数据。
14. `while ((buffer = reader.readLine()) != null) {` :循环读取每一行输出结果。
15. `sb.append("\n").append(buffer);` :将输出结果追加到StringBuilder对象中。
16. `IoUtil.close(reader);` :关闭缓冲字符输入流。
17. `IoUtil.close(isr);` :关闭字符输入流。
18. `IoUtil.close(in);` :关闭输入流。
19. `return sb.toString();` :返回StringBuilder对象中存储的所有输出结果。
20. `finally {` :最后必须执行的代码块,无论是否发生异常都会执行其中的代码。
21. `if (channelExec.isConnected()) {` :如果执行通道对象已连接,则断开连接。
22. `channelExec.disconnect();` :断开执行通道对象的连接。
23. `if (channel.isConnected()) {` :如果通道对象已连接,则断开连接。
24. `channel.disconnect();` :断开通道对象的连接。
25. `}` :结束if语句。
阅读全文