?? file-integrity.sh
字號:
#!/bin/bash# file-integrity.sh: 檢查一個給定目錄下的文件# 是否被改動了. E_DIR_NOMATCH=70E_BAD_DBFILE=71dbfile=File_record.md5# 存儲記錄的文件名(數據庫文件).set_up_database (){ echo ""$directory"" > "$dbfile" # 把目錄名寫到文件的第一行. md5sum "$directory"/* >> "$dbfile" # 在文件中附上md5 checksum和filename. }check_database (){ local n=0 local filename local checksum # ------------------------------------------- # # 這個文件檢查其實是不必要的, #+ 但是能更安全一些. if [ ! -r "$dbfile" ] then echo "Unable to read checksum database file!" exit $E_BAD_DBFILE fi # ------------------------------------------- # while read record[n] do directory_checked="${record[0]}" if [ "$directory_checked" != "$directory" ] then echo "Directories do not match up!" # 換個目錄試一下. exit $E_DIR_NOMATCH fi if [ "$n" -gt 0 ] # 不是目錄名. then filename[n]=$( echo ${record[$n]} | awk '{ print $2 }' ) # md5sum向后寫記錄, #+ 先寫checksum, 然后寫filename. checksum[n]=$( md5sum "${filename[n]}" ) if [ "${record[n]}" = "${checksum[n]}" ] then echo "${filename[n]} unchanged." elif [ "`basename ${filename[n]}`" != "$dbfile" ] # 跳過checksum數據庫文件, #+ 因為在每次調用腳本它都會被修改. # --- # 這不幸的意味著當我們在$PWD中運行這個腳本時侯, #+ 篡改這個checksum數 #+ 據庫文件將不會被檢測出來. # 練習: 修正這個問題. then echo "${filename[n]} : CHECKSUM ERROR!" # 從上次的檢查之后, 文件已經被修改. fi fi let "n+=1" done <"$dbfile" # 從checksum數據庫文件中讀. } # =================================================== ## main ()if [ -z "$1" ]then directory="$PWD" # 如果沒指定參數的話, else #+ 那么就使用當前的工作目錄. directory="$1"fi clear # 清屏.echo " Running file integrity check on $directory"echo# ------------------------------------------------------------------ # if [ ! -r "$dbfile" ] # 是否需要建立數據庫文件? then echo "Setting up database file, \""$directory"/"$dbfile"\"."; echo set_up_database fi # ------------------------------------------------------------------ #check_database # 調用主要處理函數. echo # 你可能想把這個腳本的輸出重定向到文件中, #+ 尤其在這個目錄中有很多文件的時候. exit 0# 如果要對數量非常多的文件做完整性檢查, #+ 可以考慮一下"Tripwire"包,#+ http://sourceforge.net/projects/tripwire/.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -