摘自开源项目:Jpom
TestJschExec.java
import cn.hutool.core.io.IoUtil; import cn.hutool.core.thread.SyncFinisher; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.ssh.ChannelType; import cn.hutool.extra.ssh.JschUtil; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.nio.charset.Charset; import java.util.Arrays; import java.util.concurrent.TimeUnit; /** * @author bwcx_jzy * @since 2021/7/29 */ @Slf4j public class TestJschExec { //private static final String cmd = "java -Dappliction=jpom-test-jar -jar /home/data/test/springboot-test-jar-0.0.1-SNAPSHOT.jar"; //private static final String cmd = "a + source /etc/profile && source ~/.bash_profile && source ~/.bashrc && nohup java -Dappliction=jpom-test-jar -jar /home/data/test/springboot-test-jar-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &"; //private static final String cmd = "ping baidu.com"; private static final String cmd = "ps -ef | grep jpom-test-jar | awk '{print $2}' | xargs kill -9"; @Test public void testShell() { Session session = JschUtil.createSession("192.168.1.8", 22, "root", "123456+"); System.out.println(JschUtil.execByShell(session, "source /etc/profile && source ~/.bash_profile && source ~/.bashrc && nohup java -Dappliction=jpom-test-jar -jar /home/data/test/springboot-test-jar-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &", CharsetUtil.CHARSET_UTF_8)); } @Test public void testShell2() throws Exception { String[] command = new String[]{cmd}; Session session = null; Channel channel = null; InputStream inputStream = null; OutputStream outputStream = null; try { session = JschUtil.createSession("192.168.1.8", 22, "root", "123456+"); channel = JschUtil.createChannel(session, ChannelType.SHELL); channel.connect(); inputStream = channel.getInputStream(); outputStream = channel.getOutputStream(); SyncFinisher syncFinisher = new SyncFinisher(2); PrintWriter printWriter = new PrintWriter(outputStream); InputStream finalInputStream = inputStream; StringBuffer stringBuilder = new StringBuffer(); syncFinisher.addRepeatWorker(() -> { for (String s : command) { try { printWriter.println(s); printWriter.println("exit"); //把缓冲区的数据强行输出 printWriter.flush(); //System.out.println(s + " " + command.length); } catch (Exception e) { e.printStackTrace(); log.error("写入错误", e); } } }).addRepeatWorker(() -> { try { byte[] buffer = new byte[1024]; int i; //如果没有数据来,线程会一直阻塞在这个地方等待数据。 while ((i = finalInputStream.read(buffer)) != -1) { //System.out.println(i); stringBuilder.append(new String(Arrays.copyOfRange(buffer, 0, i), CharsetUtil.CHARSET_UTF_8)); } } catch (Exception e) { log.error("读取错误", e); } }).start(); System.out.println(stringBuilder); } finally { IoUtil.close(inputStream); IoUtil.close(outputStream); JschUtil.close(channel); JschUtil.close(session); } } @Test public void test() throws IOException, JSchException { Charset charset = CharsetUtil.CHARSET_UTF_8; Session session = JschUtil.createSession("192.168.1.8", 22, "root", "123456+"); ChannelExec channel = (ChannelExec) JschUtil.createChannel(session, ChannelType.EXEC); // 添加环境变量 channel.setCommand(cmd); InputStream inputStream = channel.getInputStream(); InputStream errStream = channel.getErrStream(); channel.connect((int) TimeUnit.SECONDS.toMillis(5)); // SyncFinisher syncFinisher = new SyncFinisher(2); final String[] error = new String[1]; final String[] result = new String[1]; // syncFinisher.addRepeatWorker(() -> { try { error[0] = IoUtil.read(errStream, charset); } catch (Exception e) { e.printStackTrace(); if (!StrUtil.contains(e.getMessage(), "Pipe closed")) { log.error("读取 exec err 流发生异常", e); error[0] = "读取 exec err 流发生异常" + e.getMessage(); } } finally { syncFinisher.stop(); } }).addRepeatWorker(() -> { try { result[0] = IoUtil.read(inputStream, charset); } catch (Exception e) { e.printStackTrace(); if (!StrUtil.contains(e.getMessage(), "Pipe closed")) { log.error("读取 exec 流发生异常", e); result[0] = "读取 exec 流发生异常" + e.getMessage(); } } finally { syncFinisher.stop(); } }).start(); System.out.println(result[0] + " " + error[0]); } @Test public void test1() throws IOException, JSchException { Charset charset = CharsetUtil.CHARSET_UTF_8; Session session = JschUtil.createSession("192.168.1.8", 22, "root", "123456+"); //session.connect(); //ChannelExec channel = (ChannelExec) session.openChannel("exec"); ChannelExec channel = (ChannelExec) JschUtil.createChannel(session, ChannelType.EXEC); // 添加环境变量 channel.setCommand(cmd); InputStream inputStream = channel.getInputStream(); InputStream errStream = channel.getErrStream(); // channel.connect((int) TimeUnit.SECONDS.toMillis(5)); channel.connect(); // final String[] error = new String[1]; final String[] result = new String[1]; // try { System.out.println(error[0] = IoUtil.read(errStream, charset)); } catch (Exception e) { e.printStackTrace(); if (!StrUtil.contains(e.getMessage(), "Pipe closed")) { log.error("读取 exec err 流发生异常", e); error[0] = "读取 exec err 流发生异常" + e.getMessage(); } } try { result[0] = IoUtil.read(inputStream, charset); } catch (Exception e) { e.printStackTrace(); if (!StrUtil.contains(e.getMessage(), "Pipe closed")) { log.error("读取 exec 流发生异常", e); result[0] = "读取 exec 流发生异常" + e.getMessage(); } } System.out.println("结束 " + result[0] + " " + error[0]); } @Test public void test2() throws IOException, JSchException { Charset charset = CharsetUtil.CHARSET_UTF_8; Session session = JschUtil.createSession("192.168.1.8", 22, "root", "123456+"); ChannelExec channel = (ChannelExec) JschUtil.createChannel(session, ChannelType.EXEC); // 添加环境变量 channel.setCommand(cmd); channel.setErrStream(System.err); channel.setInputStream(System.in); InputStream inputStream = channel.getInputStream(); InputStream errStream = channel.getErrStream(); channel.connect((int) TimeUnit.SECONDS.toMillis(5)); // String error = null; String result = null; // try { result = IoUtil.read(inputStream, charset); } catch (Exception e) { e.printStackTrace(); if (!StrUtil.contains(e.getMessage(), "Pipe closed")) { log.error("读取 exec 流发生异常", e); result = "读取 exec 流发生异常" + e.getMessage(); } } try { error = IoUtil.read(errStream, charset); } catch (Exception e) { e.printStackTrace(); if (!StrUtil.contains(e.getMessage(), "Pipe closed")) { log.error("读取 exec err 流发生异常", e); error = "读取 exec err 流发生异常" + e.getMessage(); } } System.out.println("结束 " + result + " " + error); } }
TestSSh.java
/* * The MIT License (MIT) * * Copyright (c) 2019 Code Technology Studio * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.LineHandler; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.CharsetUtil; import cn.hutool.extra.ssh.ChannelType; import cn.hutool.extra.ssh.JschUtil; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.ChannelShell; import com.jcraft.jsch.Session; import java.io.*; /** * @author bwcx_jzy * @since 2019/8/8 */ public class TestSSh { private static String charset = "UTF-8"; // 设置编码格式 public static void main(String[] args) throws Exception { Session session = JschUtil.getSession("39.1.109", 23, "root", "kee"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String command; BufferedReader reader = null; ChannelShell channel = (ChannelShell) JschUtil.createChannel(session, ChannelType.SHELL); channel.setPty(true); channel.connect(); InputStream in = channel.getInputStream(); ThreadUtil.execute(() -> { IoUtil.readLines(in, CharsetUtil.CHARSET_UTF_8, (LineHandler) System.out::println); }); ThreadUtil.execute(() -> { try { IoUtil.readLines(channel.getExtInputStream(), CharsetUtil.CHARSET_UTF_8, (LineHandler) System.out::println); } catch (IOException e) { e.printStackTrace(); } }); OutputStream outputStream = channel.getOutputStream(); PrintWriter printWriter = new PrintWriter(outputStream); try { while ((command = br.readLine()) != null) { if ("*".equals(command)) { command = "0x08"; printWriter.write("0x08".toCharArray()); printWriter.flush(); continue; } printWriter.println(command); printWriter.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } channel.disconnect(); } } /** * 执行一条命令 */ public static void execCmd(String command, Session session) throws Exception { Channel channel = JschUtil.createChannel(session, ChannelType.EXEC); ((ChannelExec) channel).setCommand(command); channel.setInputStream(null); ((ChannelExec) channel).setErrStream(System.err); System.out.println("执行"); // IoUtil.readUtf8Lines(channel.getExtInputStream(), new LineHandler() { // @Override // public void handle(String line) { // System.out.println(line); // } // }); InputStream inputStream = channel.getInputStream(); channel.connect(); IoUtil.readLines(inputStream, CharsetUtil.CHARSET_UTF_8, new LineHandler() { @Override public void handle(String line) { System.out.println(line); } }); int exitStatus = channel.getExitStatus(); System.out.println(exitStatus); channel.disconnect(); session.disconnect(); } }