[背景]
项目部署到客户的服务器,运行过程重出了点小问题,需要我上去看看,然后各种远程,
显示vpn,然后是堡垒机,然后远程桌面1个windows,windows使用xshell连接服务器,
我仅仅是想执行几条调试的命令,为什么要花费这么大的代价
[解决办法]
整合commons-exec,通过http发送命令执行
pom.xml中添加依赖
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-exec</artifactId> <version>1.3</version> </dependency>
编写工具类
package com.litong.utils.exec; import java.io.ByteArrayOutputStream; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.ExecuteWatchdog; import org.apache.commons.exec.PumpStreamHandler; /** * @author bill robot * @date 2020年8月17日_下午1:59:09 * @version 1.0 * @desc */ public class ExecUtil { /** * 带返回结果的命令执行 * @return */ public static String execCmd(String command) { try { // 接收正常结果流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 接收异常结果流 ByteArrayOutputStream errorStream = new ByteArrayOutputStream(); // 解析命令 CommandLine commandline = CommandLine.parse(command); // 获取命令执行器 DefaultExecutor exec = new DefaultExecutor(); exec.setExitValues(null); // 设置一分钟超时 ExecuteWatchdog watchdog = new ExecuteWatchdog(60 * 1000); exec.setWatchdog(watchdog); //数据泵流处理器 PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream, errorStream); exec.setStreamHandler(streamHandler); //执行命令 exec.execute(commandline); // 不同操作系统注意编码,否则结果乱码 String out = outputStream.toString("GBK"); String error = errorStream.toString("GBK"); return out + error; } catch (Exception e) { e.printStackTrace(); return e.getMessage(); } } public static void main(String[] args) { String command = "ping 192.168.0.10"; String result = ExecUtil.execCmd(command); System.out.println(result); } }
编写controller
package com.litong.jfinal.controler; import com.jfinal.core.Controller; import com.litong.utils.exec.ExecUtil; /** * @author bill robot * @date 2020年8月17日_下午1:58:45 * @version 1.0 * @desc */ public class ConsoleController extends Controller { public void index(String cmd) { String execCmd = ExecUtil.execCmd(cmd); renderText(execCmd); return; } }
测试命令
完成