声明:本脚本只针对尾部被篡改的htm、html文件,以下几种:

a

[root@CHM-DD-00-E5-07 sndapk]# cat -A problem.html^M$^M$

It works !

^M$^M$^M$
^M$
Chanel handbags[root@CHM-DD-00-E5-07 sndapk]#

b

^M$^M$

It works !

^M$^M$
^M$
Chanel handbags[root@CHM-DD-00-E5-07 sndapk]#

c

^M$^M$

It works !

^M$
Chanel handbags[root@CHM-DD-00-E5-07 sndapk]#

注:下面是恶意添加的内容

<div style="position:absolute;left:expression(386-4635);top:expression(528-9313);">^M$

<a href="http://www.fuckit.com/">Chanel handbags</a>

清理:

1、使用sed脚本清理单个htm、html文件

#vim callby_htmlclean.sed

#!/bin/sed -f#本脚本除了可以配合循环语句批量处理htm、html文件外,还可直接指定要处理的htm、html文件,注意一次只能指定一个,如下:#./callby_htmlclean.sed -ni index.html:nothtmlend/<\/html>/! {        1{                #处理第一行时拷贝到保持空间,用于最后防止首行空行。                h                n                #读取下一行,继续匹配。                b nothtmlend        }        1!{                #非首行全部追加到保持空间。                H                n                #读取下一行,继续匹配。                b nothtmlend        }}#执行到这里已经找到,被篡改前的内容结尾。:findhtmlend#收集剩余的所有行到模式空间$!{        N        b findhtmlend}s/[\n\t ]//g#替换完制表符、换行符、空格后,正常html文件应该以结尾。/<\/html>$/{        H        x        p}#末尾被篡改的处理。/<\/html>$/!{        #替换当前模式空间内容为        s:\(<\/html>\).*:\1:        H        #还原html正常内容到模式空间        x        p}

运行方法:

   1、添加执行权限

   2、./callby_htmlclean.sed -ni problem.html

清理后的html文件如下:

[root@CHM-DD-00-E5-07 sndapk]# cat -A problem.html^M$^M$

It works !

^M$^M$[root@CHM-DD-00-E5-07 sndapk]#

注:

1、相比手动vim清理后的内容,结尾缺少"^M",不过没有影响。

2、该脚本比较繁琐,但经测试该脚本可以处理在</html>后同行、换行、多行等多种篡改后的格式。不影响线上正常运行、不产生临时文件。

2、shell脚本调用上面的sed脚本批量清理htm、html文件

#vim htmlclean.sh

#!/bin/bashIFS=''PATH=/bin:/usr/bin:/sbin:/usr/sbinexport IFS PATH#要调用的sed脚本必须和当前程序在同一目录下。如果sed脚本名修改,需要同时修改这里。sed_script="$(dirname "$0")/callby_htmlclean.sed"if [ ! -f "$sed_script" ];then        echo "ERROR: sed script \"$sed_script\" not found!"        exit 1fiif [ $# -ne 1 ];then        echo "Usage: $0 [full_path | listfile]"        #如果指定了目录(相对或绝对路径),会把该目录及子目录下所有以.htm或.html结尾的文件处理一遍。        echo "Example 1: $0 /web/bbs/static/"        #指定列表文件(相对或绝对路径),文件中每行一个文件同样要求是绝对路径。        echo "Example 2: $0 /tmp/problem_html_list.txt"        exit 1fiif [ -d "$1" ];then        html_list="$(find "$1" -type f -regex '.*\.html?$')"elif [ -f "$1" ];then        html_list="$(sed '' "$1")"else        echo "ERROR: invalid path or listfile."        exit 1fiwhile read html_fdo        if [[ "$html_f" =~ \.html?$ ]];then                if [ -f "$html_f" ];then                        sed -f "$sed_script" -n -i "$html_f"                else                        echo "ERROR: \"$html_f\" is not exsist."                fi        else                echo "ERROR: \"$html_f\" is not a valid html file."        fidone < <(echo "$html_list")

运行方法:

1、递归清理指定目录中的html文件(htm或html后缀),相对或绝对路径都可以。

#./htmlclean.sh /www/bbs

#bash htmlclean.sh dirname

2、清理列表文件中的html文件(htm或html后缀),相对或绝对路径都可以。

#./htmlclean.sh /tmp/htmllist.txt

#bash htmlclean.sh htmllist.txt

htmllist.txt中的内容应该使用以下格式

cat /tmp/htmllist.txt

/www/bbs/1.html/www/bbs/2.htm

注:

1、该脚本运行时需要保证和sed脚本在同一目录下。

2、该脚本只输出错误信息,添加计划任务时,记录日志需要自己指定,如:2>>/var/log/htmlclean.err >&2

3、执行时不能使用"sh 脚本名"执行,因为脚本中使用了进程替换。