Rsync 是一個 Unix 系統下的文件同步和傳輸工具。Rsync不只能夠遠程同步數據(相似於scp),固然還能夠本地同步數據(相似於cp),但不一樣於cp或scp的一點是,rsync不像cp/scp同樣會覆蓋之前的數據(若是數據已經存在),它會先判斷已經存在的數據和新數據有什麼不一樣,只有不一樣時纔會把不一樣的部分覆蓋掉。linux
1,linux安裝rsnyncvim
# yum install -y rsync
啓動rsync安全
# rsync --daemon --config=/etc/rsyncd.conf
2,rsync的經常使用選項bash
-a 歸檔模式,表示以遞歸方式傳輸文件,並保持全部屬性,等同於-rlptgoD, -a選項後面能夠跟一個 --no-OPTION 這個表示關閉-rlptgoD中的某一個例如 -a--no-l 等同於-rptgoD服務器
-r 對子目錄以遞歸模式處理,主要是針對目錄來講的,若是單獨傳一個文件不須要加-r,可是傳輸的是目錄必須加-r選項ssh
-v 打印一些信息出來,好比速率,文件數量等ide
-l 保留軟鏈結工具
-L 向對待常規文件同樣處理軟鏈結,若是是SRC中有軟鏈接文件,則加上該選項後將會把軟鏈接指向的目標文件拷貝到DST測試
-p 保持文件權限ui
-o 保持文件屬主信息
-g 保持文件屬組信息
-D 保持設備文件信息
-t 保持文件時間信息
--delete 刪除那些DST中SRC沒有的文件
--exclude=PATTERN 指定排除不須要傳輸的文件,等號後面跟文件名,能夠是萬用字符模式(如*.txt)
--progress 在同步的過程當中能夠看到同步的過程狀態,好比統計要同步的文件數量、同步的文件傳輸速度等等
-u 加上這個選項後將會把DST中比SRC還新的文件排除掉,不會覆蓋
3,rsync語法
rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
舉例:
本地拷貝:
rsync [OPTION]... SRC DEST 本地拷貝
# rsync -av 123.txt /tmp/ sending incremental file list 123.txt sent 71 bytes received 31 bytes 204.00 bytes/sec total size is 0 speedup is 0.00
上面例子表示把當前目錄下的123.txt同步到/tmp/目錄下。
也能夠更改目標文件的名字,將123.txt 改成234.txt
# rsync -av 123.txt /tmp/234.txt
遠程拷貝,(1個冒號)就屬於經過ssh的方式拷貝
rsync [OPTION]... SRC [USER@]HOST:DEST 遠程拷貝 本地->遠程
# rsync -av 123.txt 192.168.0.101:/data/ The authenticity of host '192.168.0.101 (192.168.0.101)' can't be established. RSA key fingerprint is b4:54:5f:73:ec:c2:60:5f:c3:79:c0:f9:51:e9:ac:e5. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.0.101' (RSA) to the list of known hosts. root@192.168.0.101's password:
沒有加user@host 若是不加默認指的是root.
首次鏈接會提示是否要繼續鏈接,咱們輸入yes繼續,當創建鏈接後,須要輸入密碼。若是手動去執行這些操做還好,但如果寫在腳本中怎麼辦?這就涉及到添加信任關係了,該部份內容稍後會詳細介紹。
rsync [OPTION]... [USER@]HOST:SRC DEST 遠程拷貝 遠程->本地
# rsync -av 192.168.0.101:/data/123.txt /tmp
經過ssh方式遠程拷貝,若是想不用手動輸入密碼,那麼須要使用ssh的密鑰對。
ssh的無密碼登錄:
製做認證文件
1:公鑰 rsa.pub
2:私鑰 rsa
# ssh-keygen
一路回車
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
51:e9:2a:a0:76:a2:ef:f2:51:88:52:ae:25:b8:5f:7c root@test1
# scp /root/.ssh/id_rsa.pub 192.168.0.101:/root/.ssh/authorized_keys
把公鑰發送給要遠程的ip機器,更名爲authorized_keys,而後ssh鏈接就再也不須要密碼驗證了。
遠程拷貝,(2個冒號)就屬於經過後臺服務的方式拷貝
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
這種方式能夠理解成這樣,在遠程主機上創建一個rsync的服務器,在服務器上配置好rsync的各類應用,而後本機做爲rsync的一個客戶端去鏈接遠程的rsync服務器。下面介紹如何去配置一臺rsync服務器。
1,創建並配置rsync的配置文件 /etc/rsyncd.conf
# vim /etc/rsyncd.conf port=873 log file=/var/log/rsync.log pid file=/var/run/rsyncd.pid #address=192.168.0.10 [test] path=/root/rsync use chroot=true max connections=4 ignore errors read only=yes list=true uid=root gid=root auth users=test secrets file=/etc/rsyncd.passwd hosts allow=192.168.0.101
其中配置文件分爲兩部分:所有配置部分和模塊配置部分,全局部分就是幾個參數而已,就像上面的rsyncd.conf中port, log file, pid file, address這些都屬於全局配置,而[test]如下部分就是模塊配置部分了。一個配置文件中能夠有多個模塊,模塊名自定義。其實模塊中的一些參數例如use chroot, max connections, udi, gid, auth users, secrets file以及hosts allow均可以配置成全局的參數。上面的配置文件中給出的參數並非全部的,你能夠經過man rsyncd.conf 得到更多信息。下面就簡單解釋一下這些參數的意義:
port 指定在哪一個端口啓動rsyncd服務,默認是873
log file 指定日誌文件
pid file 指定pid文件,這個文件的做用涉及到服務的啓動以及中止等進程管理操做
address 指定啓動rsyncd服務的IP,假如你的機器有多個IP,就能夠指定其中一個啓動rsyncd服務,默認是在所有IP上啓動
[test] 指定模塊名,自定義
path 指定數據存放的路徑
use chroot true|false 默認是true,意思是在傳輸文件之前首先chroot到path參數所指定的目錄下。這樣作的緣由是實現額外的安全防禦,可是缺點是須要以roots權限,而且不能備份指向外部的符號鏈接所指向的目錄文件。默認狀況下chroot值爲true,若是你的數據當中有軟鏈接文件的話建議設置成false。
max connections 指定最大的鏈接數,默認是0即沒有限制
ignore errors 忽略同步中出現的錯誤
read only yes 定義訪問方式爲只讀
list 指定當用戶查詢該服務器上的可用模塊時,該模塊是否被列出,設定爲true則列出,false則隱藏
uid/gid 指定傳輸文件時,以哪一個用戶/組的身份傳輸
auth users 指定傳輸時要使用的用戶名
secrets file 指定密碼文件,該參數連同上面的參數若是不指定則不使用密碼驗證
hosts allow 指定被容許鏈接該模塊的主機,能夠是IP或者網段,若是是多個,之間用空格隔開
編輯rsyncd.passwd密碼文件,格式爲用戶名:密碼,保存後要賦予600權限,若是權限不對,不能完成同步
# cat /etc/rsyncd.passwd
test:test123
修改權限
# chmod 600 /etc/rsyncd.passwd
啓動rsyncd服務
# rsync --daemon --config=/etc/rsyncd.conf
到另外一臺機器上測試(必須得是hosts allow中容許鏈接的IP地址)
# rsync -avL test@192.168.0.10::test /tmp/test5/
Password:
receiving incremental file list
created directory /tmp/test5
./
1
1.txt
2
2.txt
3
4
注意:這樣同步仍是須要輸入密碼,若是不想輸入密碼,有兩個方法
方法一:同步命令指定密碼文件
在客戶端上(注意,並非在rsync服務端上)編輯密碼文件
vim /etc/pass 加入test用戶的密碼:
test123
修改密碼文件的權限:(權限不對會報錯)
# chmod 600 /etc/pass
在同步的時候,指定一下密碼文件,就能夠省去輸入密碼的步驟了:
# rsync -avL test@192.168.0.10::test /tmp/test8/ --password-file=/etc/pass
receiving incremental file list
created directory /tmp/test8
./
1
1.txt
2
2.txt
3
4
test.txt
sent 190 bytes received 451 bytes 1282.00 bytes/sec
total size is 0 speedup is 0.00
方法二:在rsync服務器端不指定用戶
在rsync服務端修改配置文件rsyncd.conf, 去掉關於認證帳戶的配置項(auth user 和 secrets file這兩行):
# sed -i 's/auth users/#auth users/;s/secrets file/#secrets file/' /etc/rsyncd.conf
上面的這個命令是把 「auth users」 和 「secrets file」 兩行的最前面加一個 「#」, 這樣就把這兩行註釋掉,使其失去意義。而後咱們再到客戶端主機上測試:
# rsync -avL 192.168.0.10::test/test1/ /tmp/test9/
receiving incremental file list
created directory /tmp/test9
./
1
1.txt
2
2.txt
3
4
test.txt
sent 162 bytes received 410 bytes 1144.00 bytes/sec
total size is 0 speedup is 0.00
注意,這裏不用再加test這個用戶了,默認是以root的身份拷貝的,如今已經不須要輸入密碼了。