Estou trabalhando em um projeto onde vários Raspberry Pis coletam dados de sensores e os registram em vários arquivos, várias vezes ao dia. Eu queria escrever um pequeno script para enviar todos esses arquivos para um servidor FTP no final do dia com o crontab. Então escrevi um script usando lftp que funcionou no início, mas depois começou a mostrar erros.
Abaixo está o script e a saída detalhada. Como posso consertar isso?
#!/bin/bash
HOST='ftp://xyz.com'
USER='xxxxxx'
PASS='xxxxxx'
TARGETFOLDER='/home/xxxx'
SOURCEFOLDER='/home/pi/yyyy'
lftp -f "
open $HOST
user $USER $PASS
debug -o lftp_debug.txt
lcd $SOURCEFOLDER
mirror --reverse --delete --verbose $SOURCEFOLDER $TARGETFOLDER
bye
"
saída:
---- Connecting to xyz.com (xx.xx.xx.xx) port 21
<--- 220 (vsFTPd 3.0.3)
---> FEAT
<--- 211-Features:
<--- EPRT
<--- EPSV
<--- MDTM
<--- PASV
<--- REST STREAM
<--- SIZE
<--- TVFS
<--- 211 End
---> USER XXXX
<--- 331 Please specify the password.
---> PASS XXXX
<--- 230 Login successful.
---> PWD
<--- 257 "/home/XXXX" is the current directory
---> MKD /home
<--- 550 Create directory operation failed.
---> MKD /home/XXXX
<--- 550 Create directory operation failed.
---- CWD path to be sent is `/home/XXXX'
---> CWD /home/XXXX
<--- 250 Directory successfully changed.
---> PASV
**** control-socket: Connection reset by peer
---- Closing data socket
---- Closing control socket
##ATUALIZAÇÃO 2##
O engraçado é que quando eu faço login no mesmo servidor FTP através do comando 'FTP' com o mesmo usuário e passo, funciona perfeitamente, mas quando eu faço login lftp
com o mesmo usuário e passo, consegui fazer login no servidor, mas assim que conforme eu dou ls
o comando, ele mostra a seguinte saída.
lftp [email protected]:~> ls
`ls' at 0 [Delaying before reconnect: 24]
##ATUALIZAÇÃO 3##
Tentei usar SFTP e funcionou corretamente. Espero que isso economize o tempo de alguém.
Responder1
Não use FTP. O problema que você está enfrentando provavelmente está relacionado à confusão geral na direção da conexão no FTP. O FTP usa duas portas: uma conexão de comando e uma conexão de dados. Tradicionalmente a conexão de comando era de cliente para servidor, e a conexão de dados de servidor para cliente!
PASV é o oposto; ele instrui o servidor a escutar a conexão de dados do cliente e informar ao cliente o número da porta. Parece que esse comportamento (inesperado para muitos) é o que está mordendo você.
Porém, na minha opinião, continuar usando o FTP não é uma boa alternativa hoje. É simplesmente desatualizado, em termos de segurança e de protocolo.
Você tem várias alternativas ao FTP. Se você usa autenticação, scp/sftp é uma boa alternativa. Requer exatamente uma porta, é autenticado e criptografado.
Se você precisar de envios anônimos, http(s) é uma boa alternativa. Através de uma solicitação POST ou com WebDAV. HTTP podetambémser configurado para usar autenticação e pode ser criptografado com TLS (https). Ele também abre apenas um único canal para dados e comandos.
FTP é um protocolo de 40 anos. Ele está caindo em desuso e, como consequência, o software não está recebendo tanta atenção quanto os servidores web e servidores ssh mais populares e, portanto, há uma chance maior de vulnerabilidades graves sobreviverem no código-fonte.
Além disso, o comando para SCP seria muito mais simples: scp * $user@$host:$targetfolder
- e você poderia usar autenticação baseada em chave para evitar senhas no script!