使用 inotifywait 和 lftp 同步服务器

使用 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

答案1

这是因为 FTP 命令put $FILE会将文件放入$FILEFTP 服务器端的“当前目录”中;因此,放入 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

附言:在脚本中明确写入密码永远不是一个好主意。请使用rsync;在 Windows 上,您需要安装服务器rsync。我个人使用 Cygwin,并将其用作Windows 服务运行cygrunsrvrsync

答案2

@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

相关内容