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

 

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是加密傳輸,使用時能夠按需選擇。bash

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拷貝命令中經常使用的幾個參數說明ssh

-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進行遠程同步的時候,須要注意下面幾個技巧:ide

1)遠程拷貝時的軟連接處理svn

用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)遠程拷貝時的限流spa

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

[root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude "file1" --exclude="file2" --exclude dir1 --exclude=dir2 /var/www/src/ /var/www/dest

注意:
a)過濾參數使用"--exclude"或"--exclude="均可以,參數後面跟的文件或目錄加不加引號的效果也都同樣!
b)過濾參數後面跟的文件或目錄必須直接是文件或目錄名,不能跟路徑(不論是相對路徑仍是絕對路徑,不然就過濾不掉)

好比:下面的寫法就過濾不掉test目錄下的file1文件,不論是相對路徑仍是絕對路徑
[root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude "/var/www/src/test/file1" /var/www/src/ /var/www/dest
[root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude "../test1" /var/www/src/ /var/www/dest

去掉路徑,使用下面的寫法就能夠正常過濾了
[root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude "file1" /var/www/src/ /var/www/dest

c)另外:過濾參數還可使用通配符 避開不想同步的文件或目錄,
例如,同步/var/www/src/目錄下的內容到/var/www/dest目錄下,同步時過濾以test開頭的文件/目錄 以及 以data結尾的文件/目錄
[root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude "test*"  --exclude="*data" /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/dest
 
exclude.list文件中指定須要排除的文件或目錄列表(這個文件前面的參數只能是--exclude-from)
[root@dbtest bak]# cat exclude.list
dir1
[0-9]*
dir2/.[a-z0-9]*
.svn

或者
[root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude-from="/data/bak/exclude.list" /var/www/src/ /var/www/dest

注意:
a)過濾參數使用"--exclude-from"或者"--exclude-from="均可以,後面的文件名加不加引號效果也都同樣。
b)這裏過濾參數後面跟的exclude.list文件,爲了不出問題,最好設置爲絕對路徑。可是裏面的內容必定要寫爲相對路徑(即當前同步源目錄下的相對路徑或直接是文件名/目錄名)
c)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 ..
相關文章
相關標籤/搜索