使用inotifywait和lftp来同步服务器

我有两台服务器:

  • 服务器A(CentOS),人们可以上传文件(上传根文件)
  • 服务器B(Win 2008),FileZilla FTP服务器(FTP根目录为C:\ content)

我希望每当一个file upload到服务器A,到/文件下的任何子文件夹时,文件都会自动复制到服务器B上完全相同的子文件夹。因此,如果用户上传“flowers.jpg”到/ files / photos / 12345 /那么该文件必须通过FTP复制到C:\ content \ photos \ 12345

到目前为止,我有这个bash脚本,它将文件复制到服务器B,但所有文件放置在C:\ content,而不是在相应的子文件夹中。 谁能帮我find正确的语法?

#!/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服务运行。

@pepoluan给了我答案,但我想告诉我最后的脚本,这是略有不同的(原因是我做了这个答案,而不是在评论:你不能在评论中标记代码)

 #!/bin/bash cd /files inotifywait -q -r -m -e close_write,moved_to . --format "%w %w%f" | while read DIR FILE; do lftp -e "mkdir -p $DIR; cd $DIR; put $FILE; exit" -u user,pass -p 2121 ftp.server-a.com done