Verifique se um arquivo foi corretamente transmitido via FTP

0

Este script irá enviar um arquivo via FTP e, em seguida, apagá-lo. Mas, às vezes, o arquivo é excluído antes de a transmissão terminar e, em seguida, um arquivo vazio é recebido.

#!/bin/bash

tar czf <sourcefile> --directory=<directory> log
ftp -v -n $1 <<END_OF_SESSION
user <user> <password>
put <sourcefile> <targetfile>
bye
END_OF_SESSION

rm <sourcefile>

Qual seria uma boa maneira de sincronizar os processos, de modo que a exclusão ocorra após o envio ser concluído?

Como mostrado na atualização abaixo, a conexão às vezes não pode ser estabelecida.

Notas:

Executando no Lubuntu 16.04.

Atualizado com a linha tar .

informações de log para uma sessão com falha:

Connected to IP
220 (vsFTPd 3.0.2)
331 Please specify the password.
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Switching to Binary mode.
local: /home/user01/tmp/log.tgz remote: E1/180418090056
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.
221 Goodbye.

e um sucesso:

Connected to IP
220 (vsFTPd 3.0.2)
331 Please specify the password.
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Switching to Binary mode.
local: /home/user01/tmp/log.tgz remote: E1/180418090344
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
6901 bytes sent in 0.00 secs (43.5848 MB/s)
221 Goodbye.
    
por nightcod3r 17.04.2018 / 12:06

1 resposta

1

O comando ftp não tem funcionalidade para permitir a verificação da transferência bem-sucedida. Se você precisar continuar usando essa implementação de transferência por FTP, duas alternativas são:

  1. Faça o download do arquivo transmitido para um local temporário e compare-o por byte com a origem.
  2. Execute ls no cliente FTP e verifique se o tamanho do arquivo corresponde às expectativas. Tenha em mente que ls depende do servidor e pode variar da implementação do servidor à implementação.

A melhor solução (além de substituir o FTP inteiramente por rsync ou scp ) é usar um cliente FTP diferente que forneça um status de transferência confiável.

#!/bin/bash
tar czf <sourcefile> --directory=<directory> log
lftp -u '<user>,<password>' -e 'put -E <source> -o <target>; quit' "$1"

O comando lftp deve estar disponível na maioria das distribuições Linux. O -E flag configura o comando put para agir mais como mv em vez de cp : ele exclui o arquivo de origem após uma transferência bem-sucedida.

    
por 17.04.2018 / 15:02