鳥哥的第一本書籍的主要內容,內容稍微與書籍不太一樣了!
鳥哥的第一本書大約是在 2002 年的年底左右出版的,內容幾乎都是 Linux 基礎學習,一點也沒有談到伺服器的部份!這也是後來的雛型! 不過內容錯誤的地方很多,導致在 2003 年的年底推出了『基礎學習篇增訂版』的內容,大致上就是處理掉一些比較有嚴重錯誤的部份。 不過,因為 Linux 的版本變化非常快速,因此,寫完了這些文件之後,鳥哥還是持續在網站上更新文件內容,導致原本書籍內容的資料與網站資料差異太大! 這個問題直到鳥哥在 2008 年左右才發現!糟糕了!舊版的文件資料已經遺失~覺得相當扼腕~
因此,在底下的文件內容與當初的書籍內容雖然大同小異,不過章節的編排卻是有所不同!再花時間去一個一個處理,似乎也不太符合成本效益! 鳥哥僅是想要將自己以前的文件記錄下來而已,同時將過時的 big5 編碼改回 utf8 編碼,再加上可以支援 RWD 的樣式而已啦! 內容已經不多做編排~因此,如果內容文件你看不懂,那也是應該的! ^_^
建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。最新文章請前往鳥站首頁查閱囉!
這部分是最容易被新手所忽略的,那就是詳細而確實的紀錄或者是備份系統的登錄檔。什麼是登錄檔呢?簡單的說,就是記錄系統活動記錄的幾個檔案,例如:何時、何地(來源 IP )、何人( login name )、做了什麼動作,另外就是系統在什麼時候做了什麼樣的行為時,發生了什麼樣的事件等等,要知道的是,我們的 Linux 主機在背景之下,有相當多的 daemons 在工作著,那麼這些工作中的程序總是會有一些訊息顯示,這些顯示的訊息就是給記錄在登錄檔當中啦,也就是說,記錄這些系統的重要訊息,就是登錄檔所進行的紀錄工作的內容了。而由於這些記錄的工作內容對於系統的資訊太詳細了,若被取得將可能影響到系統的安全性,因此,通常這些登錄檔只有 root 可以進行視察的功能!
那麼為何要記錄與解析登錄檔呢?這是由於記錄檔有幾個重要的功能:
- 解決系統的錯誤:這個對於系統管理員來說是很重要的資訊,例如:開機的過程當中偵測到的硬體訊息資料會記錄到記憶體當中,由於這些偵測的資訊可以提供我們瞭解硬體資訊,所以如果你的系統發生問題時,可以下達 dmesg 看看硬體的偵測有沒有發生錯誤呢!另外,如果系統資源被耗盡、核心活動發生錯誤等等事件發生的時候,則系統登錄檔亦會將錯誤的訊息記錄在登錄檔中(通常是 /var/log/messages ),這些都可以藉以取得錯誤發生時的資訊,並加以克服問題!!
- 解決網路服務的問題:在安裝或設定新服務的套件時,最常使用到這個功能了!例如在安裝啟動 sendmail 時,如果 sendmail 無法提供服務的時候,那麼無法提供服務的問題則會被紀錄到登錄檔當中去,則只要分析登錄檔就可以瞭解問題點,並藉以解決問題啦!( 所以我們常說『天助自助者』是真的啦!察看(1)螢幕上面的錯誤訊息與(2)登錄檔的錯誤資訊,幾乎可以解決大部分的 Linux 問題! )
因此,一個有經驗的主機管理員,會隨時隨地查閱一下自己的登錄檔,以隨時掌握系統的最新脈動!那麼見的幾個登錄檔有哪些呢?一般而言,有下面幾個:
- 記錄登錄資訊:這個東西相當的重要!例如:有天您的 apache 這個 WWW 服務掛了,你怎麼知道何時掛掉的?而最後登入者是誰?!這都可以藉由分析 apache 的登錄檔來取得資訊;此外,萬一有一天您的系統被入侵,並且被利用來攻擊他人的主機,這個時候對方的主機查出是您的 Linux 在進行攻擊的行為,這個時候你要如何告知對方您的主機是由於被入侵所導致的問題,並且協助對方繼續往來源追查呢?!呵呵!此時登錄檔可是相當重要的呢!
好了,那麼記錄了這些登錄檔之後,我要做什麼分析呀!?基本上,一個好的系統管理員大概都知道『一部主機負責的服務最好能少盡量少』,這是什麼意思呢?也就是說,這部主機為郵件主機那麼就專門負責郵件工作,不要還搞 WWW 服務!這樣有幾個好處,除了系統的安全性較佳之外(因為開的 port 變少了!),記錄檔的解析也會比較簡單!因為我們的 /var/log/secure 記錄的登入者資訊就會比較有一致性!那麼我們就可以查詢一下每日登入的使用者帳號啦與錯誤訊息啦等等的!(當然囉,如果你的頻寬夠、經驗豐富的話,那麼一部主機上面安裝所有的網路服務也是可以的啦!)基本上,檢查/var/log/messages、/var/log/secure這些個檔案也就相當夠了!因為系統發生的錯誤或者是警告訊息通常都會寫入這個檔案中。
- /var/log/secure:記錄登入系統存取資料的檔案,例如 pop3, ssh, telnet, ftp 等都會記錄在此檔案中;
- /var/log/wtmp:記錄登入者的訊息資料,由於本檔案已經被編碼過,所以必須使用 last 這個指令來取出檔案的內容;
- /var/log/messages:這個檔案相當的重要,幾乎系統發生的錯誤訊息(或者是重要的資訊)都會記錄在這個檔案中;
- /var/log/boot.log:記錄開機或者是一些服務啟動的時候,所顯示的啟動或關閉訊息;
- /var/log/maillog 或 /var/log/mail/*:紀錄郵件存取或往來( sendmail 與 pop3 )的使用者記錄;
- /var/log/cron:這個是用來記錄 crontab 這個例行性服務的內容的!
- /var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log: 分別是幾個不同的網路服務的記錄檔啦!
但是,如果我手邊有數十部主機怎麼辦?我要不要一部一部去察看 log file 呢?呵呵!那樣察看會死人ㄋㄟ?因此,我們底下也使用一個簡易的登錄檔來分析 Red Hat 或 Mandrake 這兩種 Linux distribution 的登錄檔吧!
[root @test
root]# ps -aux|grep syslog
root 782 0.0 0.8 1340 508 ? S Oct30 0:00 syslogd -m 0 root 11044 0.0 1.1 2408 732 pts/1 S 00:03 0:00 grep syslog |
[root @test
root]# vi /var/log/secure
Nov 4 16:28:35 test xinetd[7831]: START: telnet pid=7841 from=192.168.1.11 Nov 4 16:28:35 test xinetd[7841]: FAIL: telnet address from=192.168.1.11 Nov 4 23:41:17 test sshd[10803]: Accepted password for test from 192.168.1.11 port 3117 ssh2 Nov 4 23:41:17 test sshd(pam_unix)[10805]: session opened for user test by (uid=500) Nov 4 23:41:29 test su(pam_unix)[10838]: authentication failure; logname=test uid=500 euid=0 tty= ruser=test rhost= user=root Nov 4 23:41:34 test su(pam_unix)[10839]: session opened for user root by test(uid=500) |
服務名稱.訊息等級 存放或顯示地點 |
例題一:如果我要將我的mail相關的資料給他寫入/var/log/maillog當中,那麼在/etc/syslog.conf就要寫成:
mail.info /var/log/maillog注意到上面喔,當我們的等級使用info時,那麼『任何大於info等級(含info這個等級)之上的訊息,都會被寫入到後面接的檔案之中!』這樣可以瞭解嗎?也就是說,我們可以將所有mail的登錄資訊都紀錄在/var/log/maillog裡面的意思啦! |
例題二:我要將新聞群組資料(news)及例行性命令的資訊(cron)都寫入到一個稱為/var/log/cronnews的檔案中,但是這兩個程序的警告訊息記錄在/var/log/cronnews.warn該如何設定我的檔案呢?很簡單啦!既然是兩個程序,那麼只好以分號來隔開了,此外,由於第二個指定檔案中,我只要記錄警告訊息,因此設定上需要指定『=』這個符號,所以就成為了:
news.*;cron.* /var/log/cronnews上面那個『=』就是在指定等級的意思啦!由於指定了等級,因此,只有這個等級的訊息才會被紀錄在這個檔案裡面呢! |
例題三:我的messages這個檔案需要記錄所有的資訊,但是就是不想要記錄cron,mail及news的資訊,那麼應該怎麼寫才好?可以有兩種寫法,分別是:
*.*;news,cron,mail.none /var/log/messages或 *.*;news.none;cron.none;mail.none /var/log/messages使用『,』分隔時,那麼等級只要接在最後一個即可,如果是以『;』來分的話,那麼就需要將服務與等級都寫上去囉!這樣會設定了吧! |
第一個例子:來自 Red Hat
7.x 版本的 syslog.conf 內容:
#kern.* /dev/console # 只要是 kernel 產生的訊息,全部都送到 console 去! # 這個項目預設是關閉的!不過,只要您願意,可以開啟就是了! *.info;mail.none;authpriv.none;cron.none
/var/log/messages
authpriv.*
/var/log/secure
mail.*
/var/log/maillog
cron.*
/var/log/cron
*.emerg
*
uucp,news.crit
/var/log/spooler
local7.*
/var/log/boot.log
|
第二個例子:來自 Mandrake
9.0 的 syslog.conf 內容!
# 各種系統的訊息 # 下面三行中,分別記錄的是: # 1. 第一行記錄的是有關『身份確認』的資訊,只要是有『登入』主機,即有 # 『輸入帳號與密碼』的程序時,都記錄到 auth.log 裡面去了,這部份的記錄主要有: # xinet(telnet, ftp), ssh, su, postfix, pop3 等等 # 2. 第二行則是除了身份記錄的資訊之外,其他的都需要記錄在/var/log/syslog當中! # 3. 第三行則是記錄了任何 user 執行的指令有呼叫系統功能所產生的某些訊息! auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog user.* -/var/log/user.log # 這個部分則是在記錄任何資訊!其實跟上面的
/var/log/syslog 有點重複了!
# 任何跟認證資訊有關的訊息都會被紀錄在
/var/log/secure 這個檔案當中,
# 任何跟郵件有關的資訊都會紀錄在底下!不過,還是分為三個等級來記錄,
# 這個部分則是在記錄關於一些例行性命令的設定之處!
# 這部份是記錄任何跟核心有關的資訊!例如我們在前一章提到的模組載入,
# 這是關於印表機的資訊啦!
# 這是新聞群組主機的資訊
# 那麼這個就是關於所有服務紀錄的檔案囉!
# 將所有已經呈現『嚴重錯誤的訊息』隨即的發送給目前在主機上面的任何人!
# 任何跟 Mandrake
Linux 有關的設定工具,所顯示的資訊都會被紀錄在這個檔案中!
|
[root @test
root]# chattr +a /var/log/messages
[root @test root]# lsattr /var/log/messages ----a--------- messages |
- logrotate:
好了!那麼我們已經將登錄資料寫入了記錄檔中了,也已經利用chattr設定了a這個屬性了,那麼該如何進行 log rotate 的工作呢!?這裡請特別留意的是, syslog 乃是利用 demand 的方式來啟動的,當有需求的時候立刻就會被執行的,但是 log rotate 卻是在規定的時間到了之後才來進行 log files 的 rotate 行為,所以這個 logrotate 程序都是掛在 cron 底下進行的呦!這一點請特別留意呦!好了,那麼 logrotate 這個程式的參數設定檔在哪裡呢?!呵呵!考慮兩個地方呦
- /etc/logrotate.conf
- /etc/logrotate.d
注意囉!那個 logrotate.conf 才是主要的參數檔案,至於 logrotate.d 是一個目錄,裡面的所有檔案都會被主動的讀入 /etc/logrotate.conf 當中來進行!另外,在/etc/logrotate.d裡面的檔案中,如果沒有規定到的一些細部設定,則以/etc/logrotate.conf這個檔案的規定來指定為預設值!好了,剛剛我們提到 log rotate 的主要功能就是將舊的登錄檔案移動成舊檔,並且重新建立一個新的空的檔案來記錄,他的執行結果有點類似底下的圖示:
由上面的圖示我們可以清楚的知道,當第一次執行完rotate之後,原本的messages會變成messages.1而且會製造一個空的messages給系統來儲存登錄檔。而第二次執行之後,則messages.1會變成messages.2而messages會變成messages.1,又造成一個空的messages來儲存登錄檔!那麼如果我們僅設定保留三個登錄檔而已的話,那麼執行第四次時,則messages.3這個檔案就會被刪除,並由後面的較新的保存登錄檔所取代!基本的工作就是這樣啦!
那麼多久進行一次 logrotate 的工作呢?嗯!這些都記錄在 logrotate.conf 裡面,我們來看一下預設的 logrotate 的內容吧!
# 底下的設定是 logrotate 的預設設定值,如果個別的檔案設定了其他的參數,
# 那麼將以個別的檔案設定為主,若該檔案沒有設定到的參數,
# 則以這個檔案的內容為預設值!# 每個禮拜進行一次 rotate 的工作
weekly# 保留幾個登錄檔呢?預設是保留四個!
rotate 4# 是否建立新的登錄檔來記錄呢?因為我們要繼續記錄,所以當然是建立囉!
create# rotate之後的登錄檔,要不要壓縮,通常是不要壓縮啦,
# 但是如果你的系統很忙碌,表示你的登錄檔很龐大的時候,
# 那麼最好就是給他壓縮一下比較不會佔空間!
Compress# 將底下這個目錄中的所有檔案都讀進來執行 rotate 的工作!
include /etc/logrotate.d# 至於登錄的資訊部分,有使用 last 來紀錄的登錄者資訊就是記錄在這個檔案中!
# 底下就是 /var/log/wtmp 這個檔案的 rotate 情況,他的意思是:
# 1. 每個月進行一次 log rotate 的工作;
# 2. 將檔案的權限設定為 664 囉!
# 3. 僅保存前一個月的 rotate 備份!這個可以改大一點,例如 5 !保存五個月,以利追蹤
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}# 底下這個檔案跟 /var/log/wtmp 類似!
/var/log/lastlog {
monthly
rotate 1
}
由這個檔案的設定我們可以知道 /etc/logrotate.d 其實就是由 /etc/logrotate.conf 所規劃出來的目錄,所以,其實我們可以將所有的資料都給他寫入 /etc/logrotate.conf 即可,但是這樣一來這個檔案就實在是太複雜了,因此,獨立出來一個 RPM 套件 就一個 rotate 的執行檔案,呵呵!似乎是比較合理的一個方法!上面的資訊是系統的預設rotate情況,不過,您可以自行的修改為自己喜歡的樣式,例如,如果您的系統的空間夠大,並且擔心除錯以及駭客的問題,那麼可以:
- 將 rotate 4 改成 rotate 9 左右,以保存較多的備份檔案;
- 大部分的登錄檔不需要 compress 囉!但是空間太小就需要 compress !尤其是很佔硬碟空間的httpd更需要compress的!
好了,上面我們大致介紹了 /var/log/wtmp 這個檔案的設定,但是還是不很詳細啦,所以底下我們以 /etc/logrotate.d/syslog 這個輪替 syslog 這個服務的檔案,來看看該如何設定他的rotate呢:
/var/log/auth.log /var/log/syslog /var/log/user.log /var/log/secure /var/log/messages /var/log/boot.log /var/log/mail/errors /var/log/mail/info /var/log/mail/warnings /var/log/cron/errors /var/log/cron/info /var/log/cron/warnings /var/log/kernel/errors /var/log/kernel/info /var/log/kernel/warnings /var/log/lpr/errors /var/log/lpr/info /var/log/lpr/warnings /var/log/news/news.err /var/log/news/news.notice /var/log/news/news.crit /var/log/daemons/errors /var/log/daemons/info /var/log/daemons/warnings /var/log/explanations {
sharedscripts
rotate 5
weekly
postrotate
/usr/bin/killall -HUP syslogd #
endscript
}
正確的 logrotate 的寫法中:
- 將 log file 名稱(包含絕對路徑)寫在前面,可以使用空白字元分隔多個 log files ;
- 用 { } 包括所有的設定;
- 設定的項目與前面提到的相同,並且可加入 rotate 前 (pre) 與後 (post) 的一些特殊執行的指令!
- prerotate:在啟動 logrotate 之前進行的指令,例如修改 log file 的屬性!!
- postrotate:在做完 logrotate 之後啟動的指令,例如重新啟動( kill -1 或 kill -HUP )某個服務!
- Prerotate與postrotate對於已經加上了特殊屬性的檔案處理上面,是相當重要的執行程序!
由於我們已經將登錄檔的屬性設定了chattr +a,所以必需要在logrotate之前將這個屬性拿掉,並在logrotate之後,再將這個屬性加回去!所以囉,那個prerotate與postrotate就顯的相當的重要啦!假設我們僅針對/var/log裡面的幾個檔案設定屬性:
- messages
- secure
- auth.log
那麼應該如何修改上面顯示的內容呢?嗯!你可以這樣做:
/var/log/auth.log /var/log/syslog /var/log/user.log /var/log/secure /var/log/messages /var/log/boot.log /var/log/mail/errors /var/log/mail/info /var/log/mail/warnings /var/log/cron/errors /var/log/cron/info /var/log/cron/warnings /var/log/kernel/errors /var/log/kernel/info /var/log/kernel/warnings /var/log/lpr/errors /var/log/lpr/info /var/log/lpr/warnings /var/log/news/news.err /var/log/news/news.notice /var/log/news/news.crit /var/log/daemons/errors /var/log/daemons/info /var/log/daemons/warnings /var/log/explanations {
sharedscripts
rotate 5
weekly
prerotate
/usr/bin/chattr -a /var/log/auth.log
/usr/bin/chattr -a /var/log/messages
/usr/bin/chattr -a /var/log/secure
endscript
postrotate
/usr/bin/killall -HUP syslogd
/usr/bin/chattr +a /var/log/auth.log
/usr/bin/chattr +a /var/log/messages
/usr/bin/chattr +a /var/log/secure
endscript
}
看到否?就是先給他去掉 a 這個屬性,然後執行了之後,再給他加入這個屬性!請特別留意的是,那個 /usr/bin/killall –HUP syslogd 的意義,這一行的目的在於將系統的 syslogd 重新以其參數檔( syslog.conf )的資料讀入一次!也可以想成是 reload 的意思啦!由於我們建立了一個新的空的紀錄檔,如果不執行此一行來重新啟動服務的話,那麼記錄的時候將會發生錯誤呦!!(請回到資源管理的章節讀一下 kill 後面的 signal 的內容說明)!
Logrotate的測試:
好了,設定完成之後,我們來測試看看這樣的設定是否可行呢?給他執行底下的指令:
[root @test root]# logrotate –f /etc/logrotate.conf
[root @test root]# lsattr /var/log/auth.log /var/log/messages /var/log/secure
----a--------- /var/log/auth.log
----a--------- /var/log/messages
----a--------- /var/log/secure
上面那個 -f 具有『強制執行』的意思,如果一切的設定都沒有問題的話,那麼理論上,您的 /var/log 這個目錄就會起變化囉!而且應該不會出現錯誤訊息才對!嘿嘿!這樣就 OK 了!很棒不是嗎?!好了,那麼預設的logrotate什麼時候執行呢?呵呵!不用擔心,系統已經幫我們設定好了!放在哪裡呢?
/etc/cron.daily/logrotate
注意看一下裡面的內容:
/usr/sbin/logrotate /etc/logrotate.conf
由於 logrotate 的工作已經加入 crontab 裡頭了!所以現在每天系統都會自動的給他查看 logrotate 囉!不用擔心的啦!!只是要注意一下那個 /var/log/messages 裡頭是否常常有:『Jun 23 04:02:00 test syslogd 1.4.1: restart.』這樣的字樣!?這說明的是 syslogd 重新啟動的時間啦(就是因為 /etc/logrotate.d/syslog 的設定之緣故!)
例題:我的/var/log/messages只希望記錄一些相當重要的資訊,關於cron的內容已經在/var/log/cron裡面記錄了,所以我想將cron的資訊移除,那麼該怎麼修改我的syslog.conf的設定呢?
答:基本上,你可以這樣設定啦![root @test root]# vi /etc/syslog.conf
修改 /var/log/messages 那一行,使成為底下的模樣就可以了!
*.info;mail.none;;news.none;authpriv.none;cron.none -/var/log/messages
[root @test root]# /etc/rc.d/init.d/syslog restart
這樣就可以啦!簡單的很!
例題:將 procmail 的 logfile (/var/log/procmail.log)加入 logrotate 當中!假設我們已經將 procmail 加入到 sendmail 的程式當中了,並且已經啟動他,這個時候,如果我想要每個月份執行一次 logrotate ,並且保留五個月份的登錄資料備份,應該怎麼作呢?
答:使用 vi 建立一個檔案,檔名為 /etc/logrotate.d/procmail,這個檔案的內容為:# This file is creating by VBird 2002/06/18上面說的是:
/var/log/procmail.log {
monthly
size=10M
rotate 5
nocompress
}1. 若該登錄檔工作超過一個月;
2. 或該登錄檔大小超過 10 MB;
3. 保存五個備份檔案;
4. 備份檔案不要壓縮!!然後儲存後離開,這樣一來,每個月就會自動的將登錄資料備份下來囉!不需要執行的啦!比較有趣的是那個 size 的參數!如果您的登錄檔老是很大的時候,可以考慮加入 size 這個參數說!他基本上有兩種單位,分別是『 k 與 M 』,請使用 man logrotate 來詳細查看一下用法囉!
- dmesg
在指令列模式直接輸入dmesg即可執行!由於系統在開機的過程當中尚未將硬碟 mount 上來,所以無法直接將資料直接給他讀到 log file 當中去,但是為了除錯上面的方便,所以在開機的過程當中的訊息還是要記錄下來,這個時候系統就將 ram 開了一個小區塊來儲存這個資料囉!這個開機記錄的檔案就是:『/proc/kmsg』啦!同時,預設的 RAM 的區塊容量在不同的版本中並不相同,目前的預設版本是 16KB 的大小呦
[root @test /root]# dmesg
- last
那麼如果要叫出來上個月的登入資料呢?!可以使用上面的第二個範例!
[root @test /root]# last
參數說明:
-number :number 為數字,如果您的登入訊息太多了,可以使用這個指令!
範例:
[test @test /root]# last -5
test pts/0 192.168.1.2 Tue Apr 9 20:34 - 20:35 (00:01)
test pts/0 192.168.1.2 Tue Apr 9 20:14 - 20:30 (00:15)
test ftpd21546 192.168.1.2 Tue Apr 9 02:55 - 03:06 (00:10)
test ftpd15813 192.168.1.2 Tue Apr 9 01:20 - 01:21 (00:00)
test pts/0 192.168.1.2 Mon Apr 8 20:14 - 00:27 (04:13)
wtmp begins Tue Apr 2 01:12:26 2002
[root @test /root]# last -f /var/log/wtmp.1 <==叫出上個月的登入資料!
我的設計理念很簡單,就是單純分析我們常常使用的幾個服務:
# 2.3a FTP
{for proftpd}
echo "========================== " >> $logfile echo "3. 關於 FTP 登錄檔的登入次數統計" >> $logfile echo "帳號 來源位址 次數 "|awk '{printf("\%-15s \%-25s \%-4s\n", $1, $2, $3)}' >> $logfile echo "FTP登入次數: `cat $basedir/messageslog|grep "FTP session opened." | wc -l`"|awk '{printf( "\%-41s \%3d\n", $1, $2)}' >> $logfile # add login ip script cat $basedir/messageslog | grep "FTP session opened."|awk '{print $7}'|cut -d"[" -f2 | cut -d"]" -f1 >"$basedir/ftploginip" /bin/awk '{ for( i=0; i<1; i++ ) Number[$i]++ }; END{ for( course in Number ) printf( "\%-41s \%3d\n", course, Number[course])}' $basedir/ftploginip|sort +2 -gr |awk '{printf("\%-41s \%3d\n", $1, $2)}'>>$logfile echo " " >> $logfile echo "FTP登入成功帳號" >> $logfile cat $basedir/messageslog | grep "(ftp) session opened for user" | awk '{print $11}' > "$basedir/messagesftp" /bin/awk '{ for( i=0; i<1; i++ ) Number[$i]++ }; END{ for( course in Number ) printf( "\%-41s \%3d\n", course, Number[course])}' $basedir/messagesftp|sort +2 -gr|awk '{printf("\%-41s \%3d\n", $1, $2)}'>>$logfile echo " " >> $logfile cat $basedir/messageslog|grep "Authentication failure." >$basedir/ftperr cat $basedir/messageslog|grep "no such user '" >>$basedir/ftperr echo "FTP錯誤登入次數:`cat $basedir/ftperr| wc -l`"|awk '{printf( "\%-41s \%3d\n", $1, $2)}' >> $logfile cat $basedir/ftperr|grep "failure."|awk '{print $7 " " $9}'|cut -d'[' -f2|cut -d':' -f1|awk '{print $2 " " $1}'|cut -d'M' -f2|cut -d']' -f1>"$basedir/ftpfail" /bin/awk '{ for( i=0; i<1; i++ ) Number[$i]++ }; END{ for( course in Number ) printf( "\%-15s \%3d\n", course, Number[course])}' $basedir/ftpfail|sort +2 -gr|awk '{printf("\%-15s \%-25s \%3d\n", $1, $2, $3)}'>>$logfile cat $basedir/ftperr|grep "no such user '"|awk '{print $7 " " $12}'|cut -d'[' -f2|awk '{print $2 " " $1}'|cut -d']' -f1>"$basedir/ftpxusr" /bin/awk '{ for( i=0; i<1; i++ ) Number[$i]++ }; END{ for( course in Number ) printf( "\%-15s \%3d\n", course, Number[course])}' $basedir/ftpxusr|sort +2 -gr|awk '{printf("\%-15s \%-25s \%3d\n", $1, $2, $3)}'>>$logfile echo " " >> $logfile |