我有两台服务器:
- 服务器 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
会将文件放入$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
附言:在脚本中明确写入密码永远不是一个好主意。请使用rsync
;在 Windows 上,您需要安装服务器rsync
。我个人使用 Cygwin,并将其用作Windows 服务运行cygrunsrv
。rsync
答案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