用Linux分析日志查看產生大量404的IP
編輯:狂族晨曦 來源:系統運維,經驗雜筆 日期:2016-05-12 閱讀: 5,392 次 11 條評論 » 百度已收錄
先森網站被阿里云通知超標消耗資源的時候查看網站的日志,發現有幾個IP一直在訪問一個不存在的目錄,產生了大量的404。查了半天沒有查出這些IP與先森使用的CDN等服務有關,看來不是什么好貨了,趕緊用.htaccess屏蔽IP。
但是有個問題,日志文件是以行為記錄,一行對應一個請求,一個日志經常成千上萬行,光靠眼睛看不能準確的識別出這些做壞的IP到底有哪些。先森一直在找有沒有能直接分析出來的日志分析工具,但搜到的都是針對搜索引擎蜘蛛痕跡做分析的,只得作罷。
近期先森在培訓紅帽Linux,經過學習,發覺Linux確實強大。而老師今天教了正則表達式,再加上以前教的各類命令,發現其實用Linux就能很好的做日志分析了。下面來分享下相關經驗。
linux命令
首先,查看日志,分析需要篩選的內容。先森貼出其中404的一例:
60.191.139.121 - - [09/May/2016:00:33:32 +0800] "GET /_detect HTTP/1.0" 404 209 "-" "-" qxu123456789.my3w.com text/html "/usr/home/qxu123456789/htdocs/_detect" 1048
需要注意的是,每行的狀態碼前后是有一個空格的,這個可以用來區分正常訪問中單純的404數字。
命令方面其實很簡單,一句搞定:
# cat web.log| grep -E ' 404 '|awk '{print $1}'|sort |uniq
先森的日志回車后,最終顯示了下面三個IP:
222.73.199.105 60.191.139.121 61.160.245.190
這樣就確認了有哪些IP在對網站造成404訪問了,這時候用.htaccess將其屏蔽即可。如果不會,可以參考先森這篇文章:
下面對上面的代碼做些解釋。
cat是將web.log的內容作為標準輸出到設備,也就是查看文件內容。
|是管道符,將左邊的輸出連接到右邊的輸入,也就是把日志內容傳給下一條命令。
gerp -E,相當于egerp,后面跟的是正則表達式,這里我們查找的內容比較簡單,所以暫時不用正則表達式。這條命令用來篩選出有404的行。
awk是做數據處理的,是一種編程語言,功能很強大。它可以用-F確定分隔符,默認是空格,這也真是我們需要的。以空格為分隔符,將每行分成了很多段,而后面的printf $1就是輸出第一段,也就是我們的IP地址。
sort是排序,這里就是對我們的IP地址進行排序。
uniq是去重,也就是將重復的IP地址去除,留下我們想要屏蔽的IP地址。
一些延伸
上面僅僅是找出404訪問IP,實際上我們可能有這種需求:找去所有的40X的訪問IP,修改上面的一個字符即可實現:
# cat web.log| grep -E ' 40. '|awk '{print $1}'|sort |uniq
.點符號在Linux正則表達式中是占位符,表示任意的一個字符。
有了上面的這種需求,可能我們除了想看IP地址,還想知道它的狀態碼是多少,再修改一下就好:
# cat web.log| grep -E ' 40. '|awk '{print $1,$9}'|sort |uniq
上面在awk的輸出增加了一個$9,表示已空格作為分隔的第九段。其實想看什么數據,只要以空格為界,數出其所在段位即可。但需要注意的是,時間段不要用來數出,這樣會導致后面的去重沒有什么效果,因為時間都是不同的。

Linux操作
最后
不得不說Linux確實強大,但是它的英文也讓先森很吃不消啊。希望能夠學好,向著運維的方向越走越遠。
轉載請注明出處來自http://www.cnidcc.cn/ylinuxfxrzckcsdl404dip.html

川公網安備 51011202000104號
評論了。怎么不出來?而且表情貌似不顯示。
這個方法太666了!!
不知道要屏蔽這些IP做什么呢?
@Koolight: 因為會造成網站資源消耗啊,顯示404頁面也需要資源的嘛。先屏為敬!
linux好復雜的,還是win好
@精選故事網: 感覺Linux更好玩,嘿嘿
我也是用的阿里云。
@夏天烤洋芋: 感謝來訪,阿里云還是造福了很多站長的
Linux我就玩不來,只能看看
Linux用著還是沒有winds方便。個人感覺。