Use inotifywait e lftp para sincronizar servidores

1

Eu tenho dois servidores:

  • Servidor A (CentOS), onde as pessoas podem fazer upload de arquivos para (fazer o upload de raiz é / arquivos)
  • Servidor B (Win 2008), com o servidor FTP do FileZilla (a raiz do FTP é C: \ content)

Eu quero que sempre que um arquivo é carregado para o servidor A, para qualquer subpasta em arquivos /, o arquivo é automaticamente copiado para a mesma subpasta no servidor B. Assim, se um usuário envia "flowers.jpg" para / arquivos / photos / 12345 / o arquivo deve ser copiado em FTP para C: \ content \ photos \ 12345

Até agora eu tenho este script bash, ele copia os arquivos para o servidor B, mas todos os arquivos são colocados em C: \ content, e não nas subpastas correspondentes. Quem pode me ajudar a encontrar a sintaxe correta?

#!/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
    
por KBoek 02.06.2014 / 14:04

2 respostas

2

Isso porque o comando put $FILE do FTP colocará o arquivo $FILE em qualquer diretório 'atual' no lado do servidor FTP; portanto, no diretório raiz do servidor FTP (localizado em C: \ content).

Primeiro, você precisa extrair o subdiretório de inotifywait 's %w output e, em seguida, prefixar um comando cd FTP no parâmetro lftp .

Eu nunca usei inotifywait antes, mas acho que o script deve ser assim:

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: Nunca é uma boa ideia escrever explicitamente uma senha em um script. Use rsync em vez disso; no Windows, você precisará instalar um servidor rsync . Eu pessoalmente uso o Cygwin, e uso cygrunsrv para fazer o rsync ser executado como um serviço do Windows.

    
por 02.06.2014 / 14:37
1

@pepoluan me deu a resposta, mas eu queria informar sobre o roteiro que acabei, o que é um pouco diferente (razão pela qual fiz isso em uma resposta e não em um comentário: você não pode marcar o código em um comentário )

#!/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
    
por 03.06.2014 / 10:15