日誌自動生成腳本
① 如何shell命令編寫自己的Web日誌分析腳本
一、讀取文件
按照上面的思路,先解決讀取問題。這里我用了判斷語句,起初我是想寫出類似於 access=more
/usr/access*.*,將這個路徑全部加到變數里,方便判斷,因為在shell里,只能將固定文件、文件夾作為變數,變數中不能加*號(我是沒找到別的方法,有知道大牛請提點下小弟),所以就想了個笨辦法,用匹配關鍵詞的方式來判斷特定目錄下,是apache日誌,還是weblogic日誌,還是IIS日誌,具體判斷方法如下:
if ls -l /usr/ | egrep "access";then
more /usr/access*.* | egrep "多個關鍵詞"
else
more /usr/ex*.log | egrep 「多個關鍵詞」
fi
這樣的方式來進行判斷,但是這樣判斷有個缺點,就是中間件日誌在/usr/目錄下,只能存在一種,比如同時存在apache和IIS的日誌,就會優先判斷apache的,進而不會執行IIS日誌分析的語句。而且,為了不跟之前的歷史數據混亂,在腳本執行開始,清空了下數據。
file=/usr/nmgxy/
if [ -e "$file" ];then
echo "日誌目錄存在,跳過創建過程,該操作會清空/usr/nmgxy/目錄下所有數據"
echo "按回車鍵開始清空數據,結束請點擊Ctrl+c"
read key
rm -r /usr/nmgxy/*
mkdir -p /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/ /usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
else
mkdir -p /usr/nmgxy/ /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/
/usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
fi
echo "分析結果日誌保存在/usr/nmgxy/目錄下"
echo ---------------------日誌目標文件---------------------------
if ls -l /usr/ | egrep "access";then
echo --------------------統計出現次數最多的前20個IP地址-----------------
cat /usr/access*.* |awk '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/top20.log
echo "統計完成"
二、定義攻擊特徵
日誌讀取的問題解決了,接下來就是定義攻擊特徵的事兒了,攻擊特徵比較好定義。例如,SQL注入攻擊的判斷:
echo ------------------------SQL注入攻擊sql.log----------------
echo "開始分析存在SQL注入的攻擊行為,並將結果保存在/usr/nmgxy/sql/目錄下"
more /usr/access*.* |egrep
"%20select%20|%20and%201=1|%20and%201=2|%20exec|%27exec|
information_schema.tables|%20information_schema.tables|%20where%20|%20union%20|%20SELECT%20|%2ctable_name%20|cmdshell|%20table_schema"
>/usr/nmgxy/sql/sql.log
echo "分析結束"
awk '{print "共檢測到SQL注入攻擊" NR"次"}' /usr/nmgxy/sql/sql.log|tail -n1
echo "開始統計SQL注入攻擊事件中,出現頻率最多的前20個IP地址"
cat /usr/nmgxy/sql/sql.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/sql/top20.log
echo ----------------------------------------------------------
more /usr/nmgxy/sql/top20.log
echo "統計結束"
我把一些常見的SQL注入攻擊的特徵寫到了裡面,去掉了MSSQL資料庫存儲過程以及MSSQL資料庫才會出現的一些注入語句。
三、輸出匹配到的含有攻擊特徵的記錄
將匹配到的攻擊特徵內容,重新輸出到了另外一個log裡面,相當於做了一次篩選/usr/nmgxy/sql/sql.log
more /usr/access*.* |egrep
"%20select%20|%20and%201=1|%20and%201=2|%20exec|%27exec|
information_schema.tables|%20information_schema.tables|%20where%20|%20union%20|%20SELECT%20|%2ctable_name%20|cmdshell|%20table_schema"
>/usr/nmgxy/sql/sql.log
然後二次分析這個篩選過的文件,統計SQL注入攻擊出現的次數
awk '{print "共檢測到SQL注入攻擊" NR"次"}' /usr/nmgxy/sql/sql.log|tail -n1
輸出完畢後,將攻擊出現最多的前20個IP地址進行統計並顯示到屏幕上
echo "開始統計SQL注入攻擊事件中,出現頻率最多的前20個IP地址"
cat /usr/nmgxy/sql/sql.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/sql/top20.log
echo ----------------------------------------------------------
more /usr/nmgxy/sql/top20.log
echo "統計結束"
四、輸出結果
這個在代碼開頭,創建了一些文件夾,用來存放篩選過的記錄
mkdir -p /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/ /usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
中間刪刪改改折騰了好幾次。後來針對特定的攻擊,我們比較關注(重點是比較好寫的= =)的內容做了HTTP響應請求200/500的判斷,並輸出結果。
echo -------------------------getshell-getshell.log----------------
echo "開始分析存在getshell的攻擊行為,並將結果保存在/usr/nmgxy/getshell/目錄下"
more /usr/access*.* |egrep "
eval|%eval|%execute|%3binsert|%20makewebtaski%20|/div.asp|/1.asp|/1.jsp|/1.php|/1.aspx|xiaoma.jsp|tom.jsp|py.jsp|k8cmd.jsp|/k8cmd|ver007.jsp|ver008.jsp|ver007|ver008|%if|\.aar"
>>/usr/nmgxy/getshell/getshell.log
echo "分析結束"
echo "二次分析結果中HTTP響應碼為200和500,結果另存為/usr/nmgxy/getshell/ok.log"
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=200) {print $1" "$2"
"$3" "$4" "$6" "$7" "$8" "$9}}' >/usr/nmgxy/getshell/ok.log
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=500) {print $1" "$2"
"$3" "$4" "$6" "$7" "$8" "$9}}' >>/usr/nmgxy/getshell/ok.log
echo "二次分析結束"
awk '{print "共檢測到getshell行為" NR "次"}' /usr/nmgxy/getshell/getshell.log|tail -n1
echo "開始統計漏洞利用攻擊事件中,出現頻率最多的前20個IP地址"
cat /usr/nmgxy/getshell/getshell.log |awk -F "[" '{print $1}' |sort
|uniq -c |sort -rn |head -20 >/usr/nmgxy/getshell/top20.log
echo ---------------------------------------------------------------
more /usr/nmgxy/getshell/top20.log
echo "統計結束"
統計HTTP響應狀態,IIS和apache有點區別。apache我以默認空格為分隔符,判斷第9個分隔符是否為200或500,如果等於,則輸出全部內容
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=500) {print $1" "$2" "$3" "$4" "$6" "$7" "$8" "$9}}'
而IIS的,我則是用獲取關鍵詞的方式,來進行判斷。
more /usr/nmgxy/getshell/getshell.log | egrep " 200" >/usr/nmgxy/getshell/ok.log
用egrep的方式,關鍵詞為" 200",200前面有個空格,如果不加空格的話,很容易跟其他的參數混起來,那個時候誤報就不是一點點了。例如asp?id=200,所以加入了空格做區分。
IIS和nginx的思路類似,唯一的區別就是特徵碼,稍微有點改動而已,這個就不一一例舉了。思路就是這個思路,其實後期想把報告整體輸出成HTML的方式,估計工作量挺大,這個還是得閑下來的時候,慢慢修改吧。
PS:這個腳本雖然寫的比較粗糙,但是精確度還是有的,測試了幾十次,精確度能達到至少80%以上。
分析1個多G的日誌文件,需要大致約30多秒左右,我是在虛擬機里做的測試。虛擬機ubuntu系統,1G的內存。
不見得能幫上大忙,至少可以給大家在分析日誌時節省點時間。。。。
先貼出apache、weblogic、IIS的腳本代碼,weblogic的從網盤直接下載就好。apache、weblogic、IIS的腳本代碼:
② 如何寫一個復制刪除的日誌的腳本
最後會為log後面數字糾結半天的,建議直接從C盤 log到D盤指定路徑,重命名為log+日期時間,並刪除最早的那個日誌文件。dos 批處理幾行就能搞定。
③ linux系統中,我部署的應用,想讓它的日誌每天生成一個,類似2014-08-06.log
:nohup XXXX>XXX.log &
:nohup XXXX>`date `.log &
date 可以格式化
man date
④ 我在java中用下面方法執行sql腳本,不輸出日誌,但是在命令窗口執行就會生成腳本
樓主,那你是什麼問題呢?是要輸出日誌、還是說不要在命令窗口顯示腳本呢。
另外,說實在的,既然使用了JAVA,不如使用JDBC來執行,讀入文件、分段執行。
⑤ crontab 的定時任務執行的腳本,有辦法把執行情況生成日誌嗎
直接crontab -e添加執行腳本,然後給執行腳本加個重定向到文件就行了。例如:30 23 * * * /path/to/shell/script >> /path/to/log/file #表示每晚的23:30執行/path/to/shell/script腳本,並且把結果重定向輸出到/path/to/log/file文件。
crontab參數:
-e:編輯該用戶的計時器設置;
-l:列出該用戶的計時器設置;
-r:刪除該用戶的計時器設置;
-u<用戶名稱>:指定要設定計時器的用戶名稱。
crontab的格式共分為六個欄位,前五段是時間設定段,第六段是要執行的命令段,格式如下: minute hour day month week command,時間欄位都是整數, command:要執行的命令,可以是系統命令,也可以是自己編寫的shell腳本文件。 在以上各個欄位中,還可以使用以下特殊字元:
星號(*):代表所有可能的值,全部。
逗號(,):可以用逗號隔開的值指定一個列表范圍。
中杠(-):可以用整數之間的中杠表示一個整數范圍。
正斜線(/):可以用正斜線指定時間的間隔頻率。
⑥ linux中weblogic的啟動腳本nohup輸出的日誌如何按每日生成
在腳本nohup設置每天開始拷貝日誌作為前一天的日誌備份,然後把當前日誌清空即可,代碼如下:
crontab-e
//增加:
00***cp/dirname/logfile.log/bakdir/logfile.`date-dyesterday+%Y%m%d`.log;cat/dev/null>/dirname/logfile.log
//每周日凌晨1:00打包、刪除文件:
01**0cd/bakdir;find./+mtime7-exectarcvflogfile.`date-dyesterday+%Y%U`.tar{};;find./-mtime91-execrm-f{};
⑦ shell腳本怎麼生成運行日誌
自己寫的腳本調用的日誌列印函數,供參考
在腳本開頭的工作
定義日誌文件LOGFILE
定義日誌序列號文件_LOGSEQ
定義日誌函數
log()
{
#檢查是否存在日誌文件,如果存在,則檢查文件是否過大(20M)
#過大時,切換文件,並將目前的日誌序列號保存在_LOGSEQ中。
if [ -f $LOGFILE ];then
LogFileLen=`ls -l ${LOGFILE} | awk '{print $5}'`
if [ $LogFileLen -gt 20971520 ]; then
if [ -f ${_LOGSEQ} ] ; then
_OrgSeq="`cat ${_LOGSEQ}`"
if [ $_OrgSeq -gt 98 ];then
LogFileSeq=0
else
LogFileSeq=`expr ${_OrgSeq} + 1`
fi
else
LogFileSeq=0
fi
echo "${LogFileSeq}" > ${_LOGSEQ}
mv $LOGFILE ${LOGFILE}.${LogFileSeq}
fi
fi
_LogInfo=$1
echo `date +20'%y-%m-%d %H:%M:%S'`" ${_LogInfo} " >> ${LOGFILE} 2>&1
}
需要打日誌時調用log函數即可
⑧ 如何實現日誌分析自動化
1.自動運行
shell腳本只需要把所有命令放到一個文本之中就可以了,windows和linux都是能夠實現sh腳本的定時運行的(具體方法請自行搜索)
2.日誌獲取
2.1shell是可以登錄ftp下載文件的,只需要將已下載的日誌文件名存儲到固定的文本之中,下載時比對已經存在的文件名,下載新的日誌文件就行了。具體步驟就是 登陸ftp--->進入固定目錄----->獲取所有文件名----->對比出新文件名------>下載。
3.數據存儲
把需要長期監控的數據放到csv文件中,每日一行,用excel打開或者另存為excel後可以很方便的生成圖表。(當然也可以存資料庫,推薦用csv,簡單有效)
4.數據獲取
比較簡單的方法就是需要的每個數據寫一條命令去獲取,第一條數據直接存儲(用>),後面的追加(用>>)到同一個文本文件中,然後再把每天的數據,添加到固定的csv文件末尾 (awk '{printf $0}' 可以直接把豎排數據變橫排)
5.周報問題(如果和日報需要的數據不同)
單獨新建一個7天和30天固定運行一次的腳本,自動分析前七天和前30天的所有日誌。從2中存儲的已下載日誌文件名的文本中,可以提取最後7天或者30天的日誌文件名,然後進行分。析(和每日的日誌分析相比,就是多了提取前7天的日誌文件名,然後由cat 1變成了cat 1,2,3,4,5,6,7)
以上在個人的windows系統上也是比較容易實現的,以後每天就可以很方便收集網站的運行數據了。
補充:
Csv格式舉例在存儲好數據之後,還可以用awk取數比對最後兩天的變化比例,超過多少就執行xxxx方法,比如在桌面輸出一個命名為「警告!dd號xxx數據波動」的文本文件