Linux
使用 inotifywait 和 lftp 同步伺服器
我有兩台伺服器:
- 伺服器A(CentOS),人們可以上傳文件到(上傳根是/files)
- 伺服器 B (Win 2008),帶有 FileZilla FTP 伺服器(FTP 根目錄是 C:\content)
我希望無論何時將文件上傳到伺服器 A,到 /files 下的任何子文件夾,該文件都會自動複製到伺服器 B 上完全相同的子文件夾。因此,如果使用者將“flowers.jpg”上傳到 /files/photos/ 12345/ 然後必須通過 FTP 將文件複製到 C:\content\photos\12345
到目前為止,我有這個 bash 腳本,它確實將文件複製到伺服器 B,但所有文件都放在 C:\content 中,而不是相應的子文件夾中。誰能幫我找到正確的語法?
#!/bin/bash cd /files inotifywait -q -r -m -e close_write,moved_to . --format %w%f | while read FILE; do lftp -e "put $FILE; exit" -u user,password -p 2121 ftp.server-a.com done
這是因為 FTP 命令
put $FILE
會將文件$FILE
放入 FTP 伺服器端的“目前目錄”中;因此,進入 FTP 伺服器的根目錄(位於 C:\content 中)。您需要首先從
inotifywait
的%w
輸出中提取子目錄,然後將cd
FTP 命令添加到lftp
參數中。我之前沒用過
inotifywait
,但是我覺得腳本應該是這樣的:inotifywait -q -r -m -e close_write,moved_to . --format "%w %f" | while read DIR FILE; do lftp -e "cd $DIR; put $FILE; exit" -u user,password -p 2121 ftp.server-a.com done
***PS:***在腳本中明確寫密碼從來都不是一個好主意。改為使用
rsync
;在 Windows 上,您需要安裝rsync
伺服器。我個人使用 Cygwin,並使用cygrunsrv
它rsync
作為 Windows 服務執行。