201406131350[UNIX] tar 指令 - 加密、解密 - 排除某目錄某檔案備份 - 差異備份

Tar 指令是在 unix 最常用的檔案打包指令,他可以將你指定的檔案或目錄給打包在一個檔案裡(包含路徑結構),但~他不會去做壓縮,要壓縮得搭配其他的壓縮程式。

基本的備份 Shell Script 我們可能會這麼寫 http://blog.xuite.net/tolarku/blog/62699058

#!/bin/bash
TODAY=`date +%Y%m%d_%H%M`
BACKUPNAME="SystemName_$TODAY.tar.gz"
BACKUPDIR=/backup_directory
tar zcvf $BACKUPDIR/$BACKUPNAME /etc  /usr/local/etc  /somefiles
mv *.tar.gz $BACKUPDIR/Backup_SystemName

其實我們可以利用 openssl 順便幫備份檔做加解密動作 http://blog.xuite.net/tolarku/blog/200434120 

針對檔案作加密
#!/bin/bash
for var in "$@"
do
echo -n "加密檔案 "
echo -n $var
echo " 使用 AES 256 CBC 方式"
tar cf - $var | openssl aes-256-cbc -e -out $var.aes -k your_key_passwd
# rm $var
done


針對已加密檔案作解密
#!/bin/bash
for var in "$@"
do
echo -n "Decrypt File "
echo -n $var
echo " with AES 256 CBC "
openssl aes-256-cbc -d -in $var -k your_key_passwd | tar xvf -
# rm $var
done

# your_key_passwd 當然要改成你自己設定的檔案密碼

註:使用 openssl 的加解密功能的缺點是,原本檔案的權限 chmod 會因為解密時檔案的單純會出而遺失原本的權限,所以我用多一層 tar 把他包起來.....衍生的缺點是檔案很大時會很費時。

另,使用這種 openssl 的 in/out 方式,其原本「未加密的檔案」跟「加密後的檔案」都會同時存在,為了空間著想你可能需要多加一行 rm 把原本的檔案刪掉,以節省空間。

我想大家都知道,如果想備份 /etc 底下所有的 config 檔,可以使用
tar zcvf etc.tar.gz  /etc/*.conf  這種方式
但是~~如果是反過來要只排除他呢? 
tar 利用 --exclude="pattern" 來排除不打包的項目

tar cvf etc.tar --exclude="*.conf"  /etc
tar cvf etc.tar --exclude="*.conf"  --exclude="*.d"  /etc

#針對某目錄不打包
tar zcvf var_today.tar.gz  --exclude="/var/log"  /var

 

tar 的差異性備份
一般使用 tar 對某個目錄打包、壓縮,都是採取全新的備份一份,也就是完整備份,但如果檔案很多、檔案很大,每次做完整備份也太久、太操,所以可以利用 tar 指令本身的參數「-g」來做到增量備份或稱為差異性備份。

tar 的指令用法

# 針對 /etc/ 目錄作完整備份,並產生「快拍檔 snapshot」用以記錄目前的檔案狀態
tar zcvf original.tar.gz -g snapshot /etc

#增量備份、差異性備份 incremental backup
# 利用「快拍檔 snapshot」 來比對記錄與目前檔案狀態

tar -zc -g snapshot -f incremental.tar.gz /etc

 

底下為差異性備份的例子
myname@host [myname/tmp] $ tar zcvf original.tar.gz -g snapshot c*  // 完整備份
c
c1
c2
c3
c4
myname@host [myname/tmp] $ echo 222222222 > c2    // 故意修改 c2 檔案
myname@host [myname/tmp] $ ls -al
total 36
drwxrwxr-x   2 myname myname 4096 Jun 13 14:02 .
drwx------  13 myname myname 4096 Jun 13 13:38 ..
-rw-rw-r--   1 myname myname    3 Jun 13 13:51 c
-rw-rw-r--   1 myname myname    3 Jun 13 13:51 c1
-rw-rw-r--   1 myname myname   10 Jun 13 14:02 c2
-rw-rw-r--   1 myname myname    3 Jun 13 13:51 c3
-rw-rw-r--   1 myname myname    3 Jun 13 14:00 c4
-rw-rw-r--   1 myname myname  214 Jun 13 14:02 original.tar.gz
-rw-rw-r--   1 myname myname   11 Jun 13 14:02 snapshot  // 快照檔
myname@host [myname/tmp] $ tar -zc -g snapshot -f incremental.tar.gz c*  // 差異性備份
myname@host [myname/tmp] $ ls -al
total 40
drwxrwxr-x   2 myname myname 4096 Jun 13 14:02 .
drwx------  13 myname myname 4096 Jun 13 13:38 ..
-rw-rw-r--   1 myname myname    3 Jun 13 13:51 c
-rw-rw-r--   1 myname myname    3 Jun 13 13:51 c1
-rw-rw-r--   1 myname myname   10 Jun 13 14:02 c2
-rw-rw-r--   1 myname myname    3 Jun 13 13:51 c3
-rw-rw-r--   1 myname myname    3 Jun 13 14:00 c4
-rw-rw-r--   1 myname myname  128 Jun 13 14:02 incremental.tar.gz
-rw-rw-r--   1 myname myname  214 Jun 13 14:02 original.tar.gz
-rw-rw-r--   1 myname myname   11 Jun 13 14:02 snapshot
myname@host [myname/tmp] $ tar ztvf original.tar.gz  //觀看完整 備份的內容 
-rw-rw-r-- myname/myname       3 2014-06-13 13:51:21 c
-rw-rw-r-- myname/myname       3 2014-06-13 13:51:26 c1
-rw-rw-r-- myname/myname       3 2014-06-13 14:00:14 c2
-rw-rw-r-- myname/myname       3 2014-06-13 13:51:34 c3
-rw-rw-r-- myname/myname       3 2014-06-13 14:00:19 c4
myname@host [myname/tmp] $ tar ztvf incremental.tar.gz   //觀看差異性備份的內容 
-rw-rw-r-- myname/myname      10 2014-06-13 14:02:21 c2
myname@host [myname/tmp] $  // 這樣的意思是說,差異性備份檔只會存放有更新或新增的檔案

~End

回應
Google Search
Google
累積 | 今日
loading......
平均分數:0 顆星
投票人數:0
我要評分:
Google