«Сброс соединения пиром» на lftp при загрузке файлов

«Сброс соединения пиром» на lftp при загрузке файлов

Я работаю над проектом, в котором несколько Raspberry Pi собирают данные датчиков и регистрируют их в нескольких файлах несколько раз в день. Я хотел написать небольшой скрипт для загрузки всех этих файлов на FTP-сервер в конце дня с помощью crontab. Поэтому я написал скрипт с использованием lftp, который сначала работал, но позже начал выдавать ошибку.

Ниже представлен скрипт и подробный вывод. Как это исправить?

    #!/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
    "

выход:

---- 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 

##ОБНОВЛЕНИЕ 2##

Забавно, что когда я вхожу на тот же FTP-сервер через команду «FTP» с тем же пользователем и паролем, все работает как часы. Но когда я вхожу через lftpтого же пользователя и пароль, я могу войти на сервер, но как только я даю lsкоманду, он показывает следующий вывод.

lftp [email protected]:~> ls
`ls' at 0 [Delaying before reconnect: 24]

##ОБНОВЛЕНИЕ 3##

Я попробовал использовать SFTP, и все заработало. Надеюсь, это сэкономит кому-то время.

решение1

Не используйте ftp. Проблема, с которой вы столкнулись, скорее всего, связана с общей путаницей в направлении соединения в FTP. FTP использует два порта: одно командное соединение и одно соединение данных. Традиционно командное соединение было от клиента к серверу, а соединение данных от сервера к клиенту!

PASV — это противоположность; он инструктирует сервер прослушивать соединение данных от клиента и сообщать клиенту его номер порта. Похоже, что это (неожиданное для многих) поведение — то, что вас кусает.

Однако, по моему мнению, продолжать использовать FTP сегодня не является хорошей альтернативой. Он просто устарел, с точки зрения безопасности и протокола.

У вас есть несколько альтернатив FTP. Если вы используете аутентификацию, scp/sftp — хорошая альтернатива. Он требует ровно один порт, аутентифицирован и зашифрован.

Если вам нужны анонимные отправки, http(s) — хорошая альтернатива. Либо через запрос POST, либо с WebDAV. Http можеттакжебыть настроен на использование аутентификации и может быть зашифрован с помощью TLS (https). Он также открывает только один канал для данных и команд.

FTP — это протокол, которому 40 лет. Он выходит из употребления, и, как следствие, программное обеспечение не получает столько внимания, сколько более популярные веб-серверы и серверы ssh, и, таким образом, существует большая вероятность сохранения серьезных уязвимостей в исходном коде.

Кроме того, команда для SCP была бы намного проще: scp * $user@$host:$targetfolder- и вы могли бы использовать аутентификацию на основе ключей, чтобы избежать паролей в скрипте!

Связанный контент