使用rsync無密碼傳輸

衆多數據庫服務器的管理過程當中,在不一樣服務器間的文件傳輸是免不了的。您可使用scp命令或FTP方法完成文件的發送和接收,這篇文章我將給你們介紹另一種方法,這就是rsync命令。
rsync是文件傳輸程序,它的功能和算法描述能夠參考維基百科中的介紹。
參考連接:http://zh.wikipedia.org/zh-cn/Rsync

我來經過實驗給你們展現一下rsync命令的經常使用方法。
這裏咱們演示使用的操做系統是Linux,rsync已經預裝好。若是是AIX操做系統,須要單獨在IBM網站下載安裝包安裝。

演示場景:將secDB1服務器SRC目錄下的內容同步傳輸到secDB2服務器DEST目錄下,整個過程在secDB1服務器上來完成。

1.在第一臺主機的根目錄下建立一個名爲「/usr/20160626」的目錄,做爲咱們傳輸演示的源目錄。
[root@secDB1 /]# mkdir /usr/20160626

2.建立文件,根據日期生成文件夾,並拷貝每日生成的文件到新的文件夾中linux

datestr=$(date +%Y%m%d)
mkdir $datestr
cp $(find /orcl/dir -name "*$datestr.txt" ) /orcl/$datestr/算法




3.在第二臺主機的根目錄下建立一個名爲「test」的目錄,做爲咱們傳輸演示的目標目錄
[root@secDB2 /]# cd /usr
[root@secDB2 /]# mkdir /test

4.將secDB1服務器20160926目錄下的內容同步傳輸到secDB2服務器test目錄下
[root@secDB1 SRC]#  rsync -av "ssh -i /usr/rsync_id_dsa" /orcl/20160926/ csdn@61.132.54.173:/usr/test
root@172.17.193.211's password:
building file list ... done
./數據庫

pos898321045110581_20160926.txt
pos898321045110582_20160926.txt
pos898321045110583_20160926.txt
pos898321045110584_20160926.txt
pos898321045110593_20160926.txt
pos898321045110594_20160926.txt
pos898321045110595_20160926.txt
pos898321045110596_20160926.txtbash



sent 162 bytes  received 70 bytes  42.18 bytes/sec
total size is 0  speedup is 0.00

5.驗證第二臺主機的test目錄下是否有發送過來的文件
[root@secDB2 /]# cd /test
[root@secDB2 DEST]# ls -ltr
total 0
-rw-r--r-- 1 root root 0 Feb 21 02:37 f1
-rw-r--r-- 1 root root 0 Feb 21 02:37 f2

文件發送成功,目的達到。

6.修改test目錄下的f1文件內容,使之與源目錄SRC中的f1目錄不相同
[root@secDB2 DEST]# echo "mod" > f1
[root@secDB2 DEST]# cat f1
mod
[root@secDB2 DEST]# ls -ltr
total 4
-rw-r--r-- 1 root root 0 Feb 21 02:37 f2
-rw-r--r-- 1 root root 4 Feb 21 02:59 f1

7.再次將20160926目錄下的內容向test目錄同步
[root@secDB1 SRC]# rsync -av /SRC/ -e ssh root@172.17.193.211:/DEST
root@172.17.193.211's password:
building file list ... done
f1

sent 114 bytes  received 48 bytes  46.29 bytes/sec
total size is 0  speedup is 0.00

注意,此時僅僅將有變化的內容f1同步到了test目錄,這也是rsync命令的優點所在。

8.在通過再次同步以後,此時DEST目錄下的文件再一次與SRC目錄下的內容保持一致。
[root@secDB2 DEST]# ls -ltr
total 0
-rw-r--r-- 1 root root 0 Feb 21 02:37 f1
-rw-r--r-- 1 root root 0 Feb 21 02:37 f2

9.注意「/」符號帶來的差異
若是將「/SRC/」後面的「/」去掉,此時將會將SRC目錄和目錄的下的全部內容通通的發送到DEST目錄下。
[root@secDB1 SRC]# rsync -av /SRC -e ssh root@172.17.193.211:/DEST
root@172.17.193.211's password:
building file list ... done
SRC/
SRC/f1
SRC/f2

sent 166 bytes  received 70 bytes  67.43 bytes/sec
total size is 0  speedup is 0.00

10.使用rsync命令的聯機幫助文檔能夠得到更多的提示信息
[root@secDB1 SRC]# rsync -h
……此處內容省略……

11.小結
rsync在給咱們傳輸文件提供另一種途徑的同時,也提升了咱們的工做效率。在存在少許差別須要完成文件同步的場合下是不二選擇。善用之。

Good luck.服務器

 

 -------------------------------------------------------------------------------------------------------------------------------------ssh

2、取消輸入密碼ide

 

問題描述post

在linux平臺上經常使用rsync協議來同步文件和目錄,'rsync'也是各類linux發行版標配的命令。當咱們基於linux平臺開發應用程序時,經常須要從Java或者Python代碼中調用rsync命令來實現文件的傳輸。網站

例如,假設咱們要按照以下需求來傳輸文件:ui

 

  • 有兩臺機器:localhost和remotehost
  • Java程序deploy在localhost上,經過rsync將本機文件傳送到remotehost,或者從remotehost pull文件到localhost
  • rsync經過ssh鏈接remotehost
  • 在remotehost有個叫csdn的賬戶,專門用來rsync傳輸文件,只能用密鑰文件登錄
  • 最重要的是,在rsync鏈接過程當中不須要輸入csdn的賬戶密碼,不然密碼輸入界面會block住Java程序的運行

要實現rsync的無密碼傳輸,基本思路是用一對公私鑰來代替賬戶密碼,實現ssh鏈接時的認證。

 

下面咱們來看看一步步如何實現。

 

配置rsync

 

1. [遠端機器] 建立專用賬戶csdn

 

[plain]  view plain  copy
 
  1. # 建立用戶組csdn  
  2. $ groupadd -g 1212 csdn  
  3.   
  4. # 建立csdn用戶,並加入csdn用戶組  
  5. $ useradd -m -s /bin/bash -g 1212 -u 1212 csdn  
  6.   
  7. # 爲csdn建立.ssh目錄  
  8. $ mkdir /home/csdn/.ssh  
  9. $ chown csdn:csdn /home/csdn/.ssh  
  10. 要上傳的文件夾$ chown csdn:csdn/usr/test

 

 

注意:

 

  • gid和uid均爲1212,此爲示例,也能夠選用其它值,只要保證不和現有的用戶和組衝突
  • "-m"表示要爲csdn用戶建立home目錄,即/home/csdn/

 

 

2. [本地機器] 用ssh-keygen生成密鑰

 

[plain]  view plain  copy
 
  1. [root@xxxx ~]$ ssh-keygen  
  2. Generating public/private rsa key pair.  
  3. Enter file in which to save the key (/root/.ssh/id_rsa): /usr/rsync_id_dsa  
  4. Enter passphrase (empty for no passphrase):  //輸入空
  5. Enter same passphrase again:     //輸入空
  6. Your identification has been saved in /usr/rsync_id_dsa.  
  7. Your public key has been saved in /usr/rsync_id_dsa.pub.  


注意:

 

 

  • 在提示輸入key file path時,爲避免覆蓋已有的root賬戶的id_rsa文件,將其存儲到/usr/rsync_id_dsa
  • 在提示輸入文件密碼時,直接按回車,採用空密碼
  • 最後生成了兩個文件,分別存儲私鑰和公鑰
 

 

3. [本地機器] 將公鑰傳送到遠端機器csdn賬戶的.ssh目錄下

 

[plain]  view plain  copy
 
  1. $ scp /usr/rsync_id_dsa.pub root@171.69.201.209:/home/csdn/.ssh  

 

 


4. [遠端機器] 將傳輸過來的公鑰導入csdn的authorized_keys文件

 

[plain]  view plain  copy
 
  1. $ cd /home/csdn/.ssh  
  2. $ cat rsync_id_dsa.pub > authorized_keys  
  3. $ chown csdn:csdn authorized_keys  

 

 

rsync命令

這樣,咱們就能夠免輸密碼在兩機器間同步文件和目錄了,好比,一個最簡單的命令:

 

[plain]  view plain  copy
 
  1. $ rsync -e "ssh -i /usr/rsync_id_dsa" /tmp/testfile csdn@remotehost:/tmp/  
  2. 傳遞文件代碼爲   [root@postest ~]# rsync -av -e  "ssh -i /usr/rsync_id_dsa" /orcl/20160926/ csdn@61.132.54.173:/usr/test

 

 

值得注意的是,當從Java或Python代碼中構建rsync命令時,有時很難將-e "ssh -i xxxx"做爲一個普通的command option,這裏有一個簡單的替代方法,就是在啓動rsync命令以前,往rsync進程中添加一個環境變量:RSYNC_RSH="ssh -i xxxx"

 

上面只是一個最簡單的rsync命令,其實rsync有許多有意思的選項,能夠幫助咱們完成不少高端大氣上檔次的功能。好比,下面是一個更加複雜的命令,用來在兩臺機器間傳輸整個目錄並在傳輸完成後刪除源文件:

 

[plain]  view plain  copy
 
  1. $ rsync -e "ssh -i /usr/rsync_id_dsa" -v --progress -r -z --compress-level=9 -o -g -p --remove-source-files --temp-dir=/tmp/rsynctmpdir/ --partial-dir=/tmp/rsynctmpdir/ --delay-updates --itemize-changes --out-format=FILEDETAIL::%%n::%%l::%%i::%%M /tmp/testfolder/ csdn@remotehost:/tmp/testfolder/  

 

 

具體參數的含義可參考rsync文檔,這裏僅做簡單說明:

 

    • -v:傳輸過程當中打印調式信息
    • --progress:傳輸過程當中打印當前進度
    • -r:遞歸傳輸全部子目錄和文件
    • -z, --compress-level=9:傳輸過程當中對文件進行壓縮,可提升傳輸效率
    • -o, -g, -p:傳輸過程當中保持文件的ownership, group和permission
    • --remove-source-files:傳輸結束以後刪除源文件。注意,在rsync 2.x中,相應的選項爲--remove-sent-files
    • --temp-dir, --partial-dir, --delay-updates:將源目錄下全部的文件放在一個transaction裏,要麼全成功,要麼全失敗。傳輸過程當中將文件放在temp-dir和partial-dir中,所有完成以後再移動到目標目錄。這幾個選項在remotehost上有其它程序須要consume傳輸完成以後的文件時特別有用。
    • --itemize-changes, --out-format:按照指定格式輸出每個要傳送的文件信息,這在應用程序須要捕獲傳輸的文件列表時頗有用。好比,應用程序僅指定在兩個機器間要同步的目錄(從localhost到remotehost,或者從remotehost到localhost),而後經過這兩個選項就能夠捕獲rsync的output,過濾出相應的輸出行(根據--out-format中指定的"FILEDETAIL"前綴字符串),而後就能夠構建出目錄下的文件列表了,好比文件名(%%n)、文件大小(%%l)等等
相關文章
相關標籤/搜索