Я работаю над проектом, в котором несколько 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
- и вы могли бы использовать аутентификацию на основе ключей, чтобы избежать паролей в скрипте!