Rsync over SSH with No Password (Crontab)

tolywang發表於2010-02-09

這裡我將簡單紀錄,最基礎的異地同步備份方法:

—如何使用 rsync + ssh + crontab 製作 mirror Files。

因為示範的關係,所以採用一般 User 來進行,
實際狀況下,如果採用 root 進行 ssh 遠端同步時,

必須修改:/etc/ssh/sshd_config。

並設定:
PermitRootLogin no
PermitRootLogin forced-commands-only

另外也必須注意,備份檔案的相關許可權問題。

########################################
rsync + ssh 基本同步化
########################################

$ sudo apt-get install rsync ssh

$ man rsync
-a, --archive (archive mode)
-v, --verbose (increase verbosity)
-z, --compress (compress file data)
-e, --rsh=COMMAND (specify rsh replacement)
--rsync-path=PATH (specify path to rsync on the remote machine)

透過 ssh 將 yenjinc.info 的 ~/backup,備份至本地端 /backup。

$ rsync -avz -e ssh yenjinc@yenjinc.info:~/backup/ /backup/
yenjinc@yenjinc.info’s password: ←(輸入密碼)

如果需要 mirror 遠端與本地端的資料,請加上 --delete 選項。

$ rsync -avz -e ssh --delete yenjinc@yenjinc.info:~/backup/ /backup/
yenjinc@yenjinc.info’s password: ←(輸入密碼)

以上僅適合一般同步作業,因為 ssh 必須提示輸入密碼才能進行同步化,
如果放在 Crontab 的話,會因為沒有辦法 key in password 而整個 hang 在那。

########################################
產生 ssh 公開金鑰與私密金鑰
########################################

rsync 會利用 ssh 登入到遠端主機,需要帳號與密碼。
若要在 crontab 中不需要輸入密碼就登入,必須製作 public / private keys。

$ ssh-keygen -t dsa -b 1024 -f yenjinc.info-key ←(file name 可自訂)
Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): ←(不需輸入,直接按 Enter)
Enter same passphrase again: ←(不需輸入,直接按 Enter)
Your identification has been saved in yenjinc.info-key.
Your public key has been saved in yenjinc.info-key.pub.
The key fingerprint is:
41:29:60:49:40:c3:a0:8f:2f:74:4e:40:64:a5:42:db Denny@PowerBook-G4.local
(公開金鑰與私密金鑰製作完成)

這時候目錄下會產生兩個檔案:
yenjinc.info-key
yenjinc.info-key.pub ←(必須放置到遠端的主機裡)

必須將 yenjinc.info-key.pub 放到遠端 ~/.ssh/authorized_keys 裡。

$ scp yenjinc.info-key.pub yenjinc@yenjinc.info:~/.ssh/
yenjinc@yenjinc.info’s password: ←(輸入密碼)
yenjinc.info-key.pub 100% 614 0.6KB/s 00:00

登入到遠端的主機,把 pub key 加入 authorized_keys 中。

$ ssh yenjinc@yenjinc.info
yenjinc@yenjinc.info’s password: ←(輸入密碼)

yenjinc@~$ cd .ssh/
yenjinc@~/.ssh$ cat yenjinc.info-key.pub >> authorized_keys
yenjinc@~/.ssh$ chmod 600 authorized_keys

完成之後,離開遠端主機,並且測試一下,是否已經可以不需密碼即 ssh login。

$ ssh -i yenjinc.info-key yenjinc@yenjinc.info ←(使用 -i 指定剛才的私密金鑰)
yenjinc@~$ ←(順利完成!不需密碼即可登入。)

########################################
rsync + ssh + No Password 基本同步化。
########################################

接著下來,即可利用 Rsync 透過 SSH 來同步本地與遠端的資料,而不需輸入密碼。
不用密碼的好處是,可以把 rsync 同步備份指令,寫在 Crontab 下自動執行。

透過 ssh 將 yenjinc.info 的 ~/backup,備份至本地端 /backup。

$ rsync -avz -e “ssh -i yenjinc.info-key” yenjinc@yenjinc.info:~/backup/ /backup/
←(順利完成!不需密碼,即可將遠端資料備份過來。)

如果需要 mirror 遠端與本地端的資料,請加上 --delete 選項。

$ rsync -avz -e “ssh -i yenjinc.info-key” --delete yenjinc@yenjinc.info:~/backup/ /backup/
←(順利完成!不需密碼,即可將將遠端的資料製作一份 mirror 到本地端。)

########################################
rsync + ssh + No Password + Crontab 基本同步化。
########################################

基本上,如果上面那一個步驟已經順利成功的話,在加上 Crontab 就不會出錯了。
只要將剛才那串指令,加到 crontab 指令中就行啦!

以下的 Script. 是在我的 OSX + Fink 的環境,若是 Linux 則需要另做修改。

#!/bin/bash
RSYNC=/sw/bin/rsync
SSH=/usr/bin/ssh
KEY=/Users/Denny/yenjinc.info-key
USER=yenjinc
HOST=yenjinc.info
REMOTE_DIR=/home/yenjinc/backup/
LOCAL_DIR=/Users/Denny/backup/

# rsync+ssh+crontab command
$RSYNC -avz -e “$SSH -i $KEY” --delete $USER@$HOST:$REMOTE_DIR $LOCAL_DIR

將以上 script. 內容,儲存為 /Users/Denny/crontab-file。
完成後,即可設定 Crontab。

$ crontab -e
*/2 * * * * /Users/Denny/crontab-file

大功告成,每兩分鐘就執行異地同步備份一次。

########################################
後記 (備註):
########################################

以上所有內容,僅是基本的 rsync+ssh+crontab 示範與練習。
如果是 Server 的環境,詳細的內容就更為繁複啦!

若想延伸閱讀,可參考以下。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-627080/,如需轉載,請註明出處,否則將追究法律責任。

相關文章