sed腳本:清理掛馬htm、html文件

聲明:本腳本只針對尾部被篡改的htm、html文件,以下幾種:

a

[root@CHM-DD-00-E5-07 sndapk]# cat -A problem.html
<html>^M$
<body>^M$
<h1>It works !</h1>^M$
</body>^M$
</html>^M$
<div style="position:absolute;left:expression(386-4635);top:expression(528-9313);">^M$
<a href="http://www.fuckit.com/">Chanel handbags</a>[root@CHM-DD-00-E5-07 sndapk]#

b

<html>^M$
<body>^M$
<h1>It works !</h1>^M$
</body>^M$
</html><div style="position:absolute;left:expression(386-4635);top:expression(528-9313);">^M$
<a href="http://www.fuckit.com/">Chanel handbags</a>[root@CHM-DD-00-E5-07 sndapk]#

c

<html>^M$
<body>^M$
<h1>It works !</h1></body></html><div style="position:absolute;left:expression(386-4635);top:expression(528-9313);">^M$
<a href="http://www.fuckit.com/">Chanel handbags</a>[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
                #讀取下一行,繼續匹配</html>。
                b nothtmlend
        }
        1!{
                #非首行全部追加到保持空間。
                H
                n
                #讀取下一行,繼續匹配</html>。
                b nothtmlend
        }
}
#執行到這裏已經找到</html>,被篡改前的內容結尾。
:findhtmlend
#收集剩餘的所有行到模式空間
$!{
        N
        b findhtmlend
}
s/[\n\t ]//g
#替換完製表符、換行符、空格後,正常html文件應該以</html>結尾。
/<\/html>$/{
        H
        x
        p
}
#</html>末尾被篡改的處理。
/<\/html>$/!{
        #替換當前模式空間內容爲</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
<html>^M$
<body>^M$
<h1>It works !</h1>^M$
</body>^M$
</html>[root@CHM-DD-00-E5-07 sndapk]#

注:

1、相比手動vim清理後的內容,結尾缺少"^M",不過沒有影響。

2、該腳本比較繁瑣,但經測試該腳本可以處理在</html>後同行、換行、多行等多種篡改後的格式。不影響線上正常運行、不產生臨時文件。


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

#vim htmlclean.sh

#!/bin/bash
IFS='
'
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export 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 1
fi
if [ $# -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 1
fi
if [ -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 1
fi
while read html_f
do
        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."
        fi
done < <(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 腳本名"執行,因爲腳本中使用了進程替換。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章