Назад | Перейти на главную страницу

Используйте inotifywait и lftp для синхронизации серверов

У меня два сервера:

Я хочу, чтобы каждый раз, когда файл загружается на сервер 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.

@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