Linux

使用 inotifywait 和 lftp 同步伺服器

  • June 3, 2014

我有兩台伺服器:

  • 伺服器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輸出中提取子目錄,然後將cdFTP 命令添加到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,並使用cygrunsrvrsync作為 Windows 服務執行。

引用自:https://serverfault.com/questions/601194