情境
- 使用synology NAS
- 有特定使用者需要自動化在特定時間上傳資料,所以沒辦法親自輸入密碼
- 不是特別在意密碼可能會被別人看到(例如使用公用帳號,密碼也是公用的)
處理方式大綱
- 建立特定帳號(如果沒有建立也沒關係,可以在底下步驟中把rsync權限改為開通給特定人士)
- 開通特定帳號rsync權限
- 在client進行檔案上傳
作法
====== server (synology nas) 設定部分 =======
- 開啟公用帳號。這邊是要避免自己在NAS上的帳號密碼在遠端server上暴露。所以設定一個帳號。這帳號記得把權限都縮到最小,避免出意外的時候災情慘重。
- 打開rsync的權限。先進入到NAS當中:
控制台 > 檔案服務 > rsync
- 設定rsync帳號
"編輯rsync帳號" > "新增"
把剛剛設定的公用帳號設定進去。這邊比較奇怪的地方是這邊選項應該是可以設定額外密碼的。但我設定完以後都沒辦法用這密碼進行rsync,只能用這帳號登入DSM的密碼才能正常運作。所以這邊密碼就不是太重要,有設定就好。
以上NAS端就設定完畢。後面進行client設定
====== client 設定部分 =======
client設定是使用普通電腦,上面跑的作業系統會比synology OS有彈性些。synology的NAS不是使用daemon進行rsync服務,所以把密碼放在環境變數中(export RSYNC_PASSWORD)或是使用檔案(--password-file=rsync_pass)儲存都無法成功。
變通方式是採用"sshpass"指令達成。
這個指令的原理大概就是會搜尋互動(prompt)的文字中有出現password的pattern,然後就直接把密碼輸入進去。狀況類似expect指令,但比expect專業一些。原本是用於ssh的互動部分,看來rsync也可以支援。
以下設定是公用帳號為rsync.cd,密碼是********。上傳的檔案檔名是zero,要放到NAS_IP的/volume1/p 資料夾底下。
- 方式1. 把密碼直接給到指令當中
sshpass -p "********" rsync -vh zero rsync.cd@NAS_IP:/volume1/p/
- 方式2. 把密碼放在檔案中(這邊檔名範例是passwrod.txt當中放入密碼)
sshpass -f passwrod.txt rsync -vh zero rsync.cd@NAS_IP:/volume1/p/
方式1跟方式2的差異在於後續推到git上需不需把密碼放到程式碼中。方式1會連同密碼一起推上去。方式2則可以透過Ansible等佈署工具做第二段設定。
沒有留言:
張貼留言