利用Java编写简单IIS日志清理工具 规格严格

摘要:
基于开源的思想,我用Java编写了一个如此小的工具。本文不做太复杂的函数。可以清除指定IIS文件的日志。也就是说,在IIS日志文件中找到指定IP地址的记录并将其删除。导入java.io.*;//在文件importjava上封装java的一些操作。实用程序。ArrayList//Java封装了链接列表,因此我们不需要自己重写它,这对于importjava非常方便。util ListIterator;//对于链接列表上的某些操作,读取IIS日志publicvoid readLog()非常方便。{try{BufferedReaderbFile=newBufferedReader;Stringdata;while((data=bFile.readLine()))!对于IIS日志文件,如果访问次数太多,生成的日志将非常大。fileName是我们输入的IIS日志文件的路径。

1楼

拿下XXX网站,提权得到管理员权限以后,大家是不是就一走了之呢?是不是忘了什么很重要的事情呢?没错,清理日志!勤快点的管理员会定时分析系统日志,看看系统什么时候发生过什么事情;细心的管理员则可以从日志里面看出我们跑进他们系统的脚印哦。
现 在网上提供的日志清理工具好多都是直接删除整个日志文件的,管理员在查日志文件时发现日志没了,不用说也知道服务器被黑,这样做是比较傻瓜的。因此,我们 就需要可以清理我们指定IP的日志这个功能。网上找了一下,发现iisantidote这个小工具可以实现,但没提供源码。我就本着开源的思想,用 Java写了这么一个小工具。本文没有做太复杂的功能,实现清理指定IIS文件的日志就OK了,即在IIS日志文件里面找到我们指定IP的记录,然后删 除。
在开始写程序前,我们引入下面三个包。
import java.io.*; //封装了java对文件的一些操作
import java.util.ArrayList; //java封装好了链表,我们无需再自己重新写,方便了很多
import java.util.ListIterator; //对链表的一些操作,非常方便
读IIS日志
public void readLog() {
try {
BufferedReader bFile = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
String data;
while ((data = bFile.readLine()) != null) {//判断是否读到空数据,空则停止
logArray.add(data);//保存数据
}
bFile.close();//处理完文件以后一定要关闭文件读取流
} catch (FileNotFoundException e) {//处理文件异常
System.out.println("文件无法找到");
} catch (IOException e) {//处理输入输出异常
e.printStackTrace();
}
}
我们先一下BufferedReader的构造方法。
BufferedReader(Reader in)用于创建一个使用默认大小输入缓冲区的缓冲字符输入流。为什么我们要选择这个类来操作文件呢?对于IIS的日志文件,如果访问量很大,那么产生的日 志就会非常庞大。如果使用一个未带缓冲区的方法来读一个大文件,会费很多的时间,程序也很容易假死,而且效率也很低下。因为这个类里面的参数是 Reader,所以我们就要用“new InputStreamReader(new FileInputStream(fileName))”来获得一个Reader类的对象。fileName就是我们输入的IIS日志文件的路径。
bFile通过readLine()每次读入一行日志记录,然后将这些记录全部存储到一个logArray的数组里面,logArray的类型是Array。我们前面说过了,Array封装了很多链表操作方法,add()就能直接将我们的数据添加进链表里。
处理IIS日志记录,删除存在指定IP的记录
public void execLog() {
ListIterator li = logArray.listIterator();
String temp;
while (li.hasNext()) {//判断是否到了链表尾部
temp = li.next().toString();//将链表数据转换成String类型
try {
if (temp.split(" ")[1].toString().equals(ip)) {//与指定的IP进行比较
} else //过滤指定IP的记录
newLogArray.add(temp); //添加到新的日志链表
} catch (Exception e) {//处理异常
e.printStackTrace();
}
}
}
ListIterator 是一个接口,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。在这里我们只用到了hasNext()和next()方 法。顾名思义,第一个是判断是否还有后续元素,第二个就是获得后续元素,我们通过循环判断所有的元素即可。temp是一个String类型的变量,每次只 存储一条日志记录,记录的格式是“时间 客户IP 访问类型 标志”,对于我们来说,我们只关心客户IP,此时调用String类的spilt()方法来获得就可以了。
temp.split(" ")能将一个String类型的变量temp按空格分成一组数组,从上面的记录格式我们可以看出,客户IP是在第二个位置的,所以我们就可以通过 temp.split(“ “)[1]来得到客户IP。equal()方法就是比较了。整个IF-ELSE里面是将与IP匹配的记录略去,然后存到新的newLogArray里面, 这样得到的newLogArray链表就是没有我们自己IP的日志列表了。

2楼


修改IIS日志文件
public void writeLog(ArrayList temp) {
ListIterator li = temp.listIterator();
//temp就是我们要写到日志文件的日志记录链表
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));
while (li.hasNext()) {
bw.write(li.next().toString() + "\n");//逐行写入,后面再加个换行
}
bw.flush();//关闭文件之前,一定要先flush()
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
写文件同样要用到带缓冲的方法,就是BufferedWriter,这里的理论跟读文件一样,就不再细说了。我们依然利用循环来将链表中的记录写进文件,最后那个换行一定要加上去,如果不加的话,写进去的时候是没有换行的。
之 后,最重要的工作就是把我们上面写的代码连接在一起了。在我们修改IIS日志文件的时候,如果只是修改过往日志,那还好,直接修改就行了。但是如果修改的 是当天日志,那可就不同了,因为IIS仍在运行,正在操作那个日志文件,我们就只有看着的份,写是写不了的了。所以,我们在修改之前,一定要把IIS先给 停了。
public void exec() {
try {
Process p = null;
p = Runtime.getRuntime().exec("cmd /c iisreset /stop");
execResult(p);//打印DOS命令执行返回的数据
p = Runtime.getRuntime().exec("cmd /c net stop w3svc");
execResult(p);
readLog();//读日志,前面已经介绍
execLog();//处理日志
writeLog(newLogArray);//修改日志
p = Runtime.getRuntime().exec("cmd /c iisreset /enable");
execResult(p);
p = Runtime.getRuntime().exec("cmd /c iisreset /start");
execResult(p);
p = Runtime.getRuntime().exec("cmd /c net start w3svc");
execResult(p);
} catch (IOException e) {
e.printStackTrace();
}
}
还 记得2007第12期《利用Java写自己的专属后门》上面讲的Process这个类吗?当时我们是用来运行系统命令的。这里我们为什么要执行 “iisreset /stop”和“net stop w3svc”呢?因为如果只用后者,在Java里面有时是无法将IIS直接停掉的,所以我们就必须先将IIS停掉,然后再停w3svc,后面对日志的操作 就不做介绍了。这里我还连续用了三组命令来启动IIS,为什么会那么麻烦呢?首先“iisreset /enable”,因为前面的“iisreset /stop”在我测试的时候有时会将IIS给禁用了;然后再“iisreset /start”和“net start w3svc”,因为后面那个命令只启动w3svc服务而没有启动IIS服务,所以为了避免出现意外就全部都加进去了。
说到这里,这次的Java版 日志删除小工具就算是完成了。对于这个小程序,实现的只是一个小小的功能,我们还可以发挥想象,继续扩展它的功能。比如我们可以一次性处理所有的日志文 件,添加多线程处理,处理其他类型的日志。说到其他类型的日志,其实我们只要知道日志的数据组织存放结构,就可以将这个类型的日志清除工具写出来的。至于 这些功能的扩展,就交给聪明的读者去完成吧。
内容不尽其对,不过可以参考一下思路

免责声明:文章转载自《利用Java编写简单IIS日志清理工具 规格严格》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS转场动画封装Metasploit后门渗透Linux系统以及跨平台后门生成下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

(4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)

Opensslrsa是RSA对称密钥的处理工具。opensslpkey是一种通用的非对称密钥处理工具。它们的用法基本相同,因此只有opensslrssa通过示例进行了说明。-Outfilename:默认情况下,opensslrss用于读取文件中的公钥或私钥并将其显示到stdout,此选项用于将读取的内容输出到指定的文件-Passonarg:传递解密密钥文件的...

element-ui的el-table和el-form嵌套使用表单校验

在表单中嵌套和使用表单来验证表单是el表自动获取的后台数据,每行都有el输入验证,因此一条规则的规则不能匹配每行。因此,如果动态属性和规则规则需要如下,则验证警报阈值是无用的。上述代码˂el-table:data=“...

xcode模拟器不显示键盘解决方案

当我们使用Xcode进行开发时,我们并不总是需要在iPhone上运行代码。有时模拟器可以解决这些问题。但当你使用模拟器时,你会发现,如果你使用模拟器上的键盘在TextFiled中输入信息,这是可以的,但如果你使用键盘输入信息,那么你会发现模拟器上的屏幕将不再显示。这是因为默认情况下,xcode使用计算机键盘作为外部键盘,不会弹出虚拟键盘。...

DD-wrt+Wiwiz搭建私人免费(收费)WiFi认证页面+详细的操作教程

因此,请选择正确的DD-WRT版本将无线路由器连接到Internet。执行以下命令:#cd;wgethttp://dl.wiwiz.com/hsbuilder-util-latest-DD-WRT.tar.gz#cd/jffs ; tar zxf/tmp/root/hsbuilder-util-lalatest-DD-WRT.tar。gz#/jffs/usr...

echarts折线图 鼠标移入改变小点显示样式

=undefined){res+=nameList[i].seriesName+':'+nameList[i].data+'%'+''}}res=res.split;returnres[0]+''+res[1];}}echarts折线图的鼠标移动上去小点显示样式修改tooltip:{trigger:'axis',formatter:function{varr...

socket网络编程(二)—— 实现持续发送

exit(exit_FAILURE);}//初始化套接字元素structsockaddr_inserver_addr;intserver_len=大小(server_addr);内存集(&server_len);0){ERR_EXIT(“listenclientfail”);client_len);buffer);}//关闭套接字(m_con...