iT邦幫忙

0

LINUX下 SHELL的寫法...

各位好...這題應該很簡單..但腦純純的偶就是寫不出來..
情況如下,我想比對..某些檔案的的MD5碼.所以我在系統建置好時就把某些檔案的MD5碼存在一個檔案裡來做以後要比對的來源檔...簡稱A檔案,檔案內容如下
EX:
83f68dad098098461b928bcf8fe7ca4f /etc/passwd
2bf992172725ec75f5115901f8c39e33 /etc/shadow
04efd9654c84207be8857a831188899a /etc/group
389ab6d4dc5565c4c7e1b44bad83aa35 /usr/bin/passwd
6f1ff4c8a0393bf66ce4883c72ef0be4 /sbin/portmap
c183ad976dda4214021208b6b14e5b7b /bin/login

我想要寫一個SCRIPT可以在我重新md5sum上面各個檔案時,可以一一比對之前的來源檔..
並列出不一致的md5檔案...

1 個回答

4
逮丸逮丸
iT邦大師 1 級 ‧ 2010-02-13 07:17:32
最佳解答

依照您您這問題的目的,可以有以下的回答:

一、若純是為了練 script 的語法的話,
大概是:

<pre class="c" name="code">mv now.txt before.txt
迴圈執行 md5sum  所要檢查的檔案 >> now.txt
diff now.txt before.txt

這樣的流程就可以秀出來了。

二、是為了 系統安全 的關係來做檔案比對的檢查,
已有現成的工具軟體可以進行。
一般最常見的是 Tripwire:

Tripwire是一套比對檔案/目錄完整性的安全工具,經由比對現存檔案與先前所建立的基準資料庫(baseline database),如果發現有任何資料受到新增、刪除或修改,Tripwire可即時通知系統管理員,並產生彈性的可讀式報告;管理員可依此評估是否要進行後續檢驗或系統還原的工作。

可參考以下網址的介紹及使用:
http://linux.vbird.org/somepaper/20030626-Tripwire.doc
http://crypto.nknu.edu.tw/netsec/using-Tripwire.htm
http://www.rtfiber.com.tw/~changyj/linuxtips/html/tripwire-easy.html

由於 Tripwire 不是完全的 free,
而有其他的同樣或更多的功能,且完全open的軟體可取代:
AIDE
Samhain

看更多先前的回應...收起先前的回應...
yaojie iT邦新手 5 級 ‧ 2010-02-13 10:46:17 檢舉

感謝你的回覆^^...
我想做到的比對是一行一行的比對,不是二個檔案下去做整體的比對...

PS:想請教...用cat /A檔案 如果一行裡有遇到空格時,讀取出來會變成二個變數...以上面為列讀出來後變成如下
83f68dad098098461b928bcf8fe7ca4f
/etc/passwd
2bf992172725ec75f5115901f8c39e33
/etc/shadow
04efd9654c84207be8857a831188899a
/etc/group
389ab6d4dc5565c4c7e1b44bad83aa35
/usr/bin/passwd
6f1ff4c8a0393bf66ce4883c72ef0be4
/sbin/portmap
c183ad976dda4214021208b6b14e5b7b
/bin/login
有辦法讓它讀取出來時維持原樣6列嗎?

依照您原來的寫法,改寫成:

<pre class="c" name="code">
for nnum in `cat md5files`
do
  newmd5=$(md5sum $nnum|awk '{print $1}')
  oldmd5=$(grep $nnum old_md5.txt|awk '{print $1}')

  if [ "$oldmd5" == "$newmd5" ] ; then
        echo "$nnum is same"
  else
        echo "$nnum is Different"
  fi
done

應可做到同樣的功能,
但這是完全沒考慮到沒有檔案、或沒權存取該檔等問題。

以上改寫是在於:
1.在分欄符號清楚的情況下,awk 比 cut 方便些。
2.用grep抓所需要的該行,而少用一迴圈
3.把執行結果的字串變成一變數,
用 變數=$(執行一些動作) 而不要用 cat 的方式,
應不會有讀取成兩變數的問題。

yaojie iT邦新手 5 級 ‧ 2010-02-15 14:35:48 檢舉

感謝你的回覆,這樣確實可以少用到迴圈又可以達到相同效果....
另有個問題請教,
我在SHELL裡設定一個變數
EX:
files="/etc/passwd /etc/shadow /etc/group"
當我用FOR迴圈時..它不是三個變數值,而是成為一串變數值..這有何解呢
for nnum in "$files"
do

done
就是因為如此,我才會先CREATE一個檔案把要檢查的檔案都先行儲存在md5files裡

把 $files 的雙引號拿掉就好了。

<pre class="c" name="code">
files="/etc/passwd /etc/shadow /etc/group"
for nnum in $files
do
        echo $nnum
done

就如您所願。

yaojie iT邦新手 5 級 ‧ 2010-02-16 10:48:46 檢舉

原來就卡在這個小符號,= =||| 難怪一直試不出來,多謝指點.....

我要發表回答

立即登入回答