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 ..