1. 程式人生 > >SCP和Rsync遠端拷貝的幾個技巧

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

-B  使用批處理模式(傳輸過程中不詢問傳輸口令或短語) 

-C  允許壓縮。(將-C標誌傳遞給ssh,從而開啟壓縮功能) 

-p  保留原檔案的修改時間,訪問時間和訪問許可權。 

-q  不顯示傳輸進度條。 

-r  遞迴複製整個目錄。 

-v 詳細方式顯示輸出。scpssh(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拷貝命令中常用的幾個引數說明

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

-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)遠端拷貝時的軟連結處理

1

2

3

4

5

6

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

 

scp遠端拷貝目錄時, 那麼目錄下的軟鏈會丟失,如果想要軟連結也拷貝過去,正確的做法是:

1)在源伺服器上, 打包, tar zcvf test.tar.gz test

2)把源伺服器上的test.tar.gz拷貝到目標伺服器上

3)在目標伺服器上執行tar zxvf test.tar.gz, 進行解包, 可以看到, 軟連結保持得好好的。

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

1)rsync命令

[[email protected] bak]# rsync -e "ssh -p22222" -avpgolr --progress db170630.tar.gz 192.168.1.198:/data/upload/

[email protected]'s password:

sending incremental file list

db170630.tar.gz

702087168 4% 5.60MB/s 0:41:47

 

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

 

2)scp命令

[[email protected] bak]# scp -v /mnt/full20100526.tar.gz /usr/local/src/

[以上命令] 本機拷貝無法顯示進度

 

[[email protected] bak]# scp -v /mnt/full20100526.tar.gz [email protected]:/usr/local/src/

[以上命令] 不同機器拷貝可以顯示進度條,即使不帶"-v"引數也可以顯示進度條

 

[[email protected] bak]# scp -v /mnt/full20100526.tar.gz [email protected]:/usr/local/src/

[以上命令] 變相實現本機帶進度條提示拷貝,可以不帶"-v"引數

 

3) cp命令

暫時沒有找到帶進度條提示拷貝

3)遠端拷貝時的限流

1

2

3

4

5

6

rsync拷貝命令(--bwlimit)

[[email protected] bak]# rsync -auvz --progress --delete --bwlimit=1000 遠端檔案 本地檔案 //限制為1000kBytes/s

[[email protected] bak]# rsync -auvz --progress --delete --bwlimit=2048 遠端檔案 本地檔案 //限制為2M/s

 

scp拷貝命令(-l引數)

[[email protected] bak]# scp -l 1024 file [email protected] //限制為1M Bytes/s

4)遠端拷貝時的過濾

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

-----rsync命令-----

需要排除某個檔案(或資料夾),可以用--exclude來指定,例如:

1)需要排除源目錄下的dir1資料夾,可以寫為:

[[email protected] bak]# /usr/bin/rsync -vzrtopg --exclude=dir1 /var/www/src/ /var/www/dest

   可以同時排除多條

[[email protected] bak]# /usr/bin/rsync -vzrtopg --exclude=dir1 --exclude=dir2 /var/www/src/ /var/www/dest

 

2)也可以通過--exclude-from來指定,例如

[[email protected] 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目錄下

[[email protected] 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 [email protected]:/data/;done

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

-----rsync命令-----

如下(注意帶/)

可以將/path/to/source/目錄下所有的檔案(包括隱藏檔案)一起拷貝到192.168.1.5機器的/path/to/dest/目錄下

[[email protected] bak]# rsync -e "ssh -p22" -avpgolr /path/to/source/ [email protected]:/path/to/dest/

  

如下(注意帶/*)

可以將/path/to/source/目錄下所有的檔案(不包括隱藏檔案)一起拷貝到192.168.1.5機器的/path/to/dest/目錄下

[[email protected] bak]# rsync -e "ssh -p22" -avpgolr /path/to/source/* [email protected]:/path/to/dest/

  

-----scp命令-----

如下(注意帶)

可以將/path/to/source/目錄下所有的檔案(包括隱藏檔案)一起拷貝到192.168.1.5機器的/path/to/dest/目錄下

[[email protected] bak]# scp -rp -P 22 /path/to/source/. [email protected]:/path/to/dest/

 

如果直接使用/,則就是把/path/to/source整個目錄拷貝到192.168.1.5機器的/path/to/dest/目錄下,即拷貝到遠端

的目錄是/path/to/dest/source

[[email protected] bak]# scp -rp -P 22 /path/to/source/ [email protected]:/path/to/dest/

 

如下(注意/*)

可以將/path/to/source/目錄下所有的檔案(不包括隱藏檔案)一起拷貝到192.168.1.5機器的/path/to/dest/目錄下

[[email protected] bak]# scp -rp -P 22 /path/to/source/* [email protected]:/path/to/dest/

 

---------------

注意,直接使用rmrm -rf刪除一個目錄時,預設目錄下的隱藏檔案是刪除不掉的,隱藏檔案需要單獨刪除,如下:

[[email protected] ~]# cd /opt/

[[email protected] 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

[[email protected] opt]# rm -rf ./*

[[email protected] 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

[[email protected] opt]# rm -rf .haha .kevin .my.cnf

[[email protected] 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 ..

***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************