先說明: 為了避免直接套用, 造成知其然卻不知其所以然的使用; 所以我只說明建立的構想, 不實作樣本.
緣起:
相信還有不少辦公室, 採用了 Windows 為作業環境, 而為了預防病毒入侵, 使用了防毒軟體. 但是更新病毒碼的部份, 如果更新太頻繁, 會影響網路流量; 如果辦公室有一台 Domain Controller (Samba 也可以做到), 折衷的辦法, 就是先將定義檔抓到特定主機上, 再手動更新或者強制"登入網域"的 Windows 都更新. 為了達到這個目的, 所以透過 crontab 的排程, lynx 抓取網頁內容, wget 抓取檔案等程式; 最重要的, 就是透過 shell script 加以組合.
首先, 以 Symantec 公司的病毒定義檔為例, 該公司的病毒定義檔幾乎是放在同樣的目錄, 以日期為版本基準, 於是可以區別出幾個參數:
1. 存放病毒定義檔的網站以及目錄: 幾乎不變.
2. 病毒定義檔適用的平台 i32 , i64 等, 在檔名的最後, 由於各辦公室使用的環境不一, 但通常也是固定不變的.
3. 病毒定義檔版本, 是使用日期為主, 但是並非每天都有更新, 而且因為時區的關係, 抓取檔案的日期和病毒定義檔的日期比較難一致.
由於病毒定義檔存放的主要網頁是不變的,
(在 http://www.symantec.com.tw/avcenter/download/pages/US-N95.html )
因此可以透過 lynx -dump (註1) , 抓取該網頁直接顯示於 STDOUT (註2)
從剛剛抓到的網頁畫面, 最後有附上目前的病毒定義檔位置, 所以可以透過"管線(pipeline)", 將剛剛 STDOUT 的內容, 轉為 grep 的 STDIN :
lynx -dump http:.... (STDOUT) | (STDIN) grep (STDOUT) | ....
-> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> ->
而我們辦公室都是使用 i32 版本的 symantec , 所以使用了兩次 grep , 第一次是只抓取檔名有 "i32.exe" 的資料, 第二次則是抓取網站為 "definitions.symantec.com" 的資料, 在兩次過濾之後, 抓取到的就是有目前最新版的病毒定義檔.
但是經過過濾後的資料, 病毒定義檔的 URL 同一行, 仍然有些沒有用到的資料, 於是再使用管線(pipeline), 以 awk 來區別 URL 和其他部份, 只保留 URL 本身, 大致上就像:
awk -F "http" '{print "http"$2}' #; 以 http 區隔, 取第二段(http之前的就不要了)
awk -F "i32.exe" '{print $1"i32.exe"}' #; 以 i32.exe 當區隔, 取第一段(i32.exe之後的就不要了)
取得目前最新的病毒定義檔所在的 URL 之後, 就可以透過 lynx -dump 或 wget 來抓取, 而這樣的組合, 可以使用 `` 記號, 把剛剛的所有程式與管線都包在 `` 內, 這樣 wget `....` 的效果就和 wget http://defi.... 相同, 或者也可以用 lynx -dump `....` > virusdef.exe 的方式進行.
最後, 就是把這個 shell script , 前面加上指定 shell 位置的 #!/bin/sh , 然後寫入 crontab , 設定一個時間點(個人覺得 6:00am 不錯用, 因為大部份的上班族是在 8:00am 左右上班, 剛好更新為最新版的病毒定義檔)
就這樣, 希望對各位有所助益, 如果覺得好用, 歡迎捐款給:
http://eec.kta.org.tw 高雄市教師會生態教育中心.
(本人與該中心無關, 只是認同該中心理念與運作)
如果覺得不好用, 歡迎在此提出來討論.
註1: 由於 lynx 版本不一, 所以我用的 lynx -dump 會直接顯示有病毒定義檔位置的 URL , 有些版本的 lynx 並不顯示 URL , 就必須改用 lynx -source 取得整個 source code , 後續的處理也就稍有不同, 這也就是為什麼我不想寫樣本, 因為並不能一體適用.
註2: STDIN 與 STDOUT 只是預設的輸入與輸出, 而在 shell script 中, 可以透過 ">" "<" "|" 來達到輸入或輸出的轉向.



因為牽涉的東西好像太多了, 先來張簡單的架構圖吧:

會這樣考慮也有幾個前提:
1. 辦公室有接近 10 台電腦使用 Windows 和 Symantec 防毒軟體, 經常要更新病毒碼; 但是有些防毒軟體的更新期限已經過期, 只能下載病毒定義檔, 再手動更新.
2. 病毒定義檔的位置是很固定的, 但是幾乎 1~2 天就有一個新版本, 於是之前就經常需要: a. 先抓病毒定義檔, 放到網路芳鄰主機, 再 b. 督促同事撥空更新(會照做的太少了, 前陣子就發現有 3 台 Windows 電腦中毒 :( )
3. 因為已經有一台 Linux 架設 Samba 作為辦公室的網路芳鄰主機, Linux 提供了 shell script , lynx , wget , awk , grep 等程式, 而且是不關機的電腦, 很適合先把病毒定義檔自動抓下來, 就可以取代了 2a 的動作.
4. 由於 Samba 也可以架設為 Domain Controller , 提供 Windows 的"登入網域(Domain)"功能, 如果 Windows 登入網域後, 會自動執行特定的 login batch , 於是再把更新病毒定義檔的動作, 寫在 login batch 內, 就可以省下 2b 的動作.
而前面的說明, 就是在這個步驟 3 的詳細流程....(這樣應該比較好懂了....



說明:
1. 使用環境: Slackware Linux 10.2 版.
2. 需要的程式: bash, awk, grep, head, wget, lynx, find, ls, rm
3. 由於各軟體版本間的差異, 並不保證這個 shell scrip 能套用於其他環境.
(shell script 開始)
#!/bin/sh
virusdef_path=/mnt/share/computer/病毒定義檔
wget -c -P $virusdef_path \
` lynx -dump "http://www.symantec.com.tw/avcenter/download/pages/US-N95.html" \
| grep "i32.exe" | grep "definitions.symantec.com" \
| awk -F "http" '{print "http"$2}' | awk -F "i32.exe" '{print $1"i32.exe"}' `
find $virusdef_path -type f ! -name `ls -t $virusdef_path | head -n 1` \
-exec rm -fr {} \;
(shell script 結束)
shell script 邏輯架構.
(第一部份: 自動抓取最新版的病毒定義檔)
1. "http://www.symantec.com.tw/avcenter/download/pages/US-N95.html" : 這個網址是 Norton AntiVirus 病毒定義檔的網頁, 裡面會提到目前最新版的病毒定義檔位置.
2. lynx -dump "http://.....html" : 使用 lynx 程式, 將網頁的文字部份抓下來.
3. grep "i32.exe" : 由於要抓取的是 32 位元 Windows 用的版本, 檔名最後都有 i32.exe , 所以用 grep 挑出剛剛網頁內容中, 有 i32.exe 的部份.
4. grep "definitions.symantec.com" : 剛剛過濾出含有 i32.exe 的部份, 會抓到兩行, 一行是病毒定義檔的所在, 一行是說明, 所以再挑出 "def....", 這個就是病毒定義檔所在.
5. awk -F "http" '{print "http"$2}' : 剛剛的病毒定義檔前後仍有些不必要的文字, 所以先以 http 區隔, 將 http 之後的部份列出來(也就是把 http 之前的累贅去掉.)
6. awk -F "i32.exe" '{print $1"i32.exe"}' : 原則同第 5 項, 把 i32.exe 之後的累贅去掉.
7. 剛剛已經取得了病毒定義檔所在的 URL , 但是這個 URL 要當成其他程式的參數, 所以用 `` 引號括起來.
8. wget -c -P $virusdef_path : 抓取剛剛整理好的 URL , 並加上兩個參數, -c 參數是確保抓下來的檔案只有一個, 如果之前沒抓完全, 會自動接續, -P 參數是指定檔案存放的目錄.
(第二部份: 刪除不是最新版的病毒定義檔)
1. ls -t $virusdef_path : 列出 $virusdef_path 這個目錄的檔案, 並且以時間排序, 比較新的在上面.
2. head -n 1 : 由剛剛的檔案清單, 挑出第一行, 也就是最新的檔案.
3. 剛剛兩個步驟就找出了該目錄下最新的檔案名稱, 要當成其他程式的參數, 所以用 `` 引號括起來.
4a. find $virusdef_path : find 是一個搜尋檔案的程式, 這邊表示要搜尋病毒定義檔的目錄.
4b. -type f: 搜尋時, 只有檔案才列入(目錄就不會列入).
4c. ! -name `....`: 將剛剛步驟 3 的檔案去掉不找, 所以目錄下如果有很多檔案, 除了最新版的檔案外都會被找出來.
4d. -exec rm -fr {} \;: 由剛剛找出來的檔案清單(全部檔案除了一個最新版的檔案外), 進行刪除動作.
註1: #!/bin/sh 是一般的 shell script 開頭, 指定這個 script 由 /bin/sh 處理.
註2: virusdef_path 是自行指定的目錄, 配合提供分享的目錄設定.
allen_hsiao wrote:
如果是公司行號買的是企業版的掃毒軟體(Symantec/TrendMicro),根本不用擔心上述提到的會吃掉大量頻寬,因為企業內部會有一台病毒碼更新伺服器,使用者是連線到企業內部的這台伺服器去更新病毒碼~~~~~
以個人所知, 會有幾個要求:
1. 企業版本身的費用. (10 人授權版 10000 多元)
2. 企業版需要搭配 Windows , 而且有限制某些 Windows 版本才能用, 如果再購置一台 Windows 也需要再付出一些成本. (至少是 $3000~$5000 , 如果取得 OEM 版的話)
而一般個人電腦, 有些會送隨機版的 Norton , 差別是"自動更新的期限"有限制(NAV 是三個月), 而我瀏覽授權, 並沒有限制超過三個月後不能再用.
畢竟 Windows 只有 5 年維護(大量授權版可能更短, 只有 1~2 年), 再加上防毒軟體企業版的價格; 使用 Linux 並用 shell script 作為替代方案, 這些費用花在寫這個 shell script 是綽綽有餘, 甚至未來 Linux 更新和使用年限都能更長久, 這樣就值得了.
http://slime.is.dreaming.org/computer/symantec/virusdef.html
每個小時更新一次, 點選這個網址後, 就會自動跳到 Symantec 的病毒碼下載區, 如果剛好有小型網路使用者需要, 可以從這邊下載.
註1: 目前只有抓取 Windows 32bit 版.
註2: 由於我沒有使用 Symantec , 如果有發生異常還請跟我說.
註3: 如果覺得有益, 歡迎小額自由捐款給 Mobile01
內文搜尋

X