SCP和Rsync遠端拷貝的幾個技巧

散盡浮華發表於2018-03-08

 

scp是secure copy的簡寫,用於在Linux下進行遠端拷貝檔案的命令,和它類似的命令有cp,不過cp只是在本機進行拷貝不能跨伺服器,而且scp傳輸是加密的。可能會稍微影響一下速度。當你伺服器硬碟變為只讀 read only system時,用scp可以幫你把檔案移出來。另外,scp還非常不佔資源,不會提高多少系統負荷,在這一點上,rsync就遠遠不及它了。雖然 rsync比scp會快一點,但當小檔案眾多的情況下,rsync會導致硬碟I/O非常高,而scp基本不影響系統正常使用。scp在誇機器複製的時候為了提高資料的安全性,使用了ssh連線和加密方式,如果機器之間配置了ssh免密碼登入,那在使用scp的時候密碼都不用輸入。

一般而言,我們會選擇使用rsync進行遠端同步或拷貝。rsync和scp的區別在於:
-> rsync只對差異檔案做更新,可以做增量或全量備份;而scp只能做全量備份。簡單說就是rsync只傳修改了的部分,如果改動較小就不需要全部重傳,所以rsync備份速度較快;預設情況下,rsync 通過比較檔案的最後修改時間(mtime)和檔案的大小(size)來確認哪些檔案需要被同步過去。
-> rsync是分塊校驗+傳輸,scp是整個檔案傳輸。rsync比scp有優勢的地方在於單個大檔案的一小部分存在改動時,只需傳輸改動部分,無需重新傳輸整個檔案。如果傳輸一個新的檔案,理論上rsync沒有優勢;
-> rsync不是加密傳輸,而scp是加密傳輸,使用時可以按需選擇。

SCP拷貝命令中常用的幾個引數說明

-B  使用批處理模式(傳輸過程中不詢問傳輸口令或短語)  
-C  允許壓縮。(將-C標誌傳遞給ssh,從而開啟壓縮功能)  
-p  保留原檔案的修改時間,訪問時間和訪問許可權。  
-q  不顯示傳輸進度條。  
-r  遞迴複製整個目錄。  
-v 詳細方式顯示輸出。scp和ssh(1)會顯示出整個過程的除錯資訊。這些資訊用於除錯連線,驗證和配置問題。   
-c cipher  以cipher將資料傳輸進行加密,這個選項將直接傳遞給ssh。   
-F ssh_config  指定一個替代的ssh配置檔案,此引數直接傳遞給ssh。  
-i identity_file  從指定檔案中讀取傳輸時使用的金鑰檔案,此引數直接傳遞給ssh。    
-l limit  限定使用者所能使用的頻寬,以Kbit/s為單位。     
-o ssh_option  如果習慣於使用ssh_config(5)中的引數傳遞方式,   
-P port  注意是大寫的P, port是指定資料傳輸用到的埠號   
-S program  指定加密傳輸時所使用的程式。此程式必須能夠理解ssh(1)的選項。

Rsync拷貝命令中常用的幾個引數說明

-a, --archive 歸檔模式,表示以遞迴方式傳輸檔案,並保持所有檔案屬性,等於-rlptgoD
-v, --verbose 詳細模式輸出
-p, --perms 保持檔案許可權
-g, --group 保持檔案屬組資訊
-o, --owner 保持檔案屬主資訊
-r, --recursive 對子目錄以遞迴模式處理。同步目錄的時候要加上這個引數
-l, --links 保留軟鏈結,加上這個引數,同步過來的檔案會保持之前的軟連結屬性不變
-H, --hard-links 保留硬鏈結
-e, --rsh=COMMAND 指定使用rsh、ssh方式進行資料同步
-z, --compress 對備份的檔案在傳輸時進行壓縮處理
--stats 給出某些檔案的傳輸狀態
--progress 列印同步的過程
--timeout=TIME 同步過程中,IP超時時間,單位為秒
--delete 刪除那些目標目錄中有而源目錄中沒有的多餘檔案。這個是rsync做增量方式的全備份的最佳選擇方案!!!!!!
--delete-before 接受者在輸出之前進行刪除操作。即先將目標目錄中檔案全部刪除,再將源目錄檔案拷貝過去。這是rsync保持目標目錄跟源目錄一致的方案!!!
--delete-after 在同步操作之後做比較,刪除那些目標目錄中有而源目錄中沒有的多餘檔案
--delete-excluded 刪除目標目錄中那些被該選項指定排除的檔案
--ignore-errors 即使出現IO錯誤也進行刪除,忽略錯誤
--exclude 指定同步時需要過濾掉的檔案或子目錄(即不需要同步過去的),後面直接跟不需要同步的單個檔名或子目錄(不需要跟路徑) ,過濾多個檔案或子目錄,就使用多個--exclude
--exclude-from 指定同步時需要過濾掉的檔案或子目錄,後面跟檔案(比如/root/exclue.txt),然後將不需要同步的檔案和子目錄放到/root/exclue.txt下。
--version 列印版本資訊
--port=PORT 指定其他的rsync服務埠
--log-format=formAT 指定日誌檔案格式
--password-file=FILE 從FILE中得到密碼
--bwlimit=KBPS 限制I/O頻寬,KBytes per second

在使用SCP和Rsync進行遠端同步的時候,需要注意下面幾個技巧:

1)遠端拷貝時的軟連結處理

用rsync遠端拷貝目錄時,只需要加上-l引數就可以實現拷貝軟連結。

用scp遠端拷貝目錄時, 那麼目錄下的軟鏈會丟失,如果想要軟連結也拷貝過去,正確的做法是:
1)在源伺服器上, 打包, tar zcvf test.tar.gz test
2)把源伺服器上的test.tar.gz拷貝到目標伺服器上
3)在目標伺服器上執行tar zxvf test.tar.gz, 進行解包, 可以看到, 軟連結保持得好好的。

2)遠端拷貝時的進度條顯示

1)rsync命令
[root@dbtest bak]# rsync -e "ssh -p22222" -avpgolr --progress db170630.tar.gz 192.168.1.198:/data/upload/
root@192.168.1.198's password: 
sending incremental file list
db170630.tar.gz
702087168 4% 5.60MB/s 0:41:47

--progress 可以實現本機帶進度條提示拷貝,可以實現不同機器帶進度條提示拷貝,可以拷貝多個檔案

2)scp命令
[root@dbtest bak]# scp -v /mnt/full20100526.tar.gz /usr/local/src/ 
[以上命令] 本機拷貝無法顯示進度

[root@dbtest bak]# scp -v /mnt/full20100526.tar.gz root@192.168.1.1:/usr/local/src/ 
[以上命令] 不同機器拷貝可以顯示進度條,即使不帶"-v"引數也可以顯示進度條

[root@dbtest bak]# scp -v /mnt/full20100526.tar.gz root@127.0.0.1:/usr/local/src/ 
[以上命令] 變相實現本機帶進度條提示拷貝,可以不帶"-v"引數

3) cp命令
暫時沒有找到帶進度條提示拷貝

3)遠端拷貝時的限流

rsync拷貝命令(--bwlimit)
[root@dbtest bak]# rsync -auvz --progress --delete --bwlimit=1000 遠端檔案 本地檔案 //限制為1000kBytes/s
[root@dbtest bak]# rsync -auvz --progress --delete --bwlimit=2048 遠端檔案 本地檔案 //限制為2M/s

scp拷貝命令(-l引數)
[root@dbtest bak]# scp -l 1024 file root@192.168.1.100 //限制為1M Bytes/s

4)遠端拷貝時的過濾

-----rsync命令-----
需要排除某個檔案(或資料夾),可以用--exclude來指定,例如:
1)需要排除源目錄下的dir1資料夾,可以寫為:
[root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude=dir1 /var/www/src/ /var/www/dest
   可以同時排除多條
[root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude=dir1 --exclude=dir2 /var/www/src/ /var/www/dest

2)也可以通過--exclude-from來指定,例如
[root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude-from=exclude.list /var/www/src/ /var/www/de

exclude.list檔案中指定需要排除的列表,例如:
dir1
[0-9]*
dir2/.[a-z0-9]*
.svn

注意:
exclude和exclude-from前面都是有兩個減號,如果漏寫了一個,命令列不會報錯,但是不能排除執行的檔案或資料夾。

-----scp命令-----
結合find命令進行操作,例如:
將/data目錄下除了ms目錄之外的所有目錄及檔案遠端拷貝到10.0.11.202機器的/data目錄下
[root@dbtest bak]# for i in `find /data/ -type d -path /data/ms -prune -o -print |awk -F"/" '{print $3}'|sort|uniq`;do /usr/bin/scp -r /data/$i root@10.0.11.202:/data/;done

5)遠端拷貝時的隱藏檔案

-----rsync命令-----
如下(注意帶/)
可以將/path/to/source/目錄下所有的檔案(包括隱藏檔案)一起拷貝到192.168.1.5機器的/path/to/dest/目錄下
[root@dbtest bak]# rsync -e "ssh -p22" -avpgolr /path/to/source/ user@192.168.1.5:/path/to/dest/
 
如下(注意帶/*)
可以將/path/to/source/目錄下所有的檔案(不包括隱藏檔案)一起拷貝到192.168.1.5機器的/path/to/dest/目錄下
[root@dbtest bak]# rsync -e "ssh -p22" -avpgolr /path/to/source/* user@192.168.1.5:/path/to/dest/
 
-----scp命令-----
如下(注意帶)
可以將/path/to/source/目錄下所有的檔案(包括隱藏檔案)一起拷貝到192.168.1.5機器的/path/to/dest/目錄下
[root@dbtest bak]# scp -rp -P 22 /path/to/source/. user@192.168.1.5:/path/to/dest/

如果直接使用/,則就是把/path/to/source整個目錄拷貝到192.168.1.5機器的/path/to/dest/目錄下,即拷貝到遠端
的目錄是/path/to/dest/source
[root@dbtest bak]# scp -rp -P 22 /path/to/source/ user@192.168.1.5:/path/to/dest/

如下(注意/*)
可以將/path/to/source/目錄下所有的檔案(不包括隱藏檔案)一起拷貝到192.168.1.5機器的/path/to/dest/目錄下
[root@dbtest bak]# scp -rp -P 22 /path/to/source/* user@192.168.1.5:/path/to/dest/

---------------
注意,直接使用rm或rm -rf刪除一個目錄時,預設目錄下的隱藏檔案是刪除不掉的,隱藏檔案需要單獨刪除,如下:
[root@dbtest ~]# cd /opt/
[root@dbtest opt]# ll -a
total 28
drwxr-xr-x.  3 root root 4096 Mar  8 15:00 .
dr-xr-xr-x. 27 root root 4096 Feb 26 03:54 ..
-rw-r--r--.  1 root root    0 Mar  8 09:47 ac
-rw-r--r--.  1 root root   45 Mar  8 09:47 a.txt
-rw-r--r--.  1 root root    0 Mar  8 09:47 bb
-rw-r--r--.  1 root root   21 Mar  8 09:45 b.txt
-rw-r--r--.  1 root root    0 Mar  8 09:47 gg
-rw-r--r--.  1 root root   52 Mar  8 15:00 .haha
drwxr-xr-x.  2 root root 4096 Mar  8 15:00 .kevin
-rw-r--r--.  1 root root   33 Mar  8 15:00 .my.cnf
[root@dbtest opt]# rm -rf ./*
[root@dbtest opt]# ll -a
total 20
drwxr-xr-x.  3 root root 4096 Mar  8 17:44 .
dr-xr-xr-x. 27 root root 4096 Feb 26 03:54 ..
-rw-r--r--.  1 root root   52 Mar  8 15:00 .haha
drwxr-xr-x.  2 root root 4096 Mar  8 15:00 .kevin
-rw-r--r--.  1 root root   33 Mar  8 15:00 .my.cnf
[root@dbtest opt]# rm -rf .haha .kevin .my.cnf 
[root@dbtest opt]# ll -a
total 8
drwxr-xr-x.  2 root root 4096 Mar  8 17:44 .
dr-xr-xr-x. 27 root root 4096 Feb 26 03:54 ..

相關文章