Я работаю над проектом, в котором несколько Raspberry Pis собирают данные датчиков и записывают их в несколько файлов несколько раз в день. Я хотел написать небольшой скрипт для загрузки всех этих файлов на 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
"
output:
---- 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
Забавно, когда я вхожу на тот же FTP-сервер через ' FTP 'с одним и тем же пользователем и передать его работает как шарм, но когда я вхожу через lftp с тем же пользователем и передаю, я смог войти на сервер, но как только я дам команду ls, он показывает нижеследующий мощность.
lftp user@xyz.com:~> ls
`ls' at 0 [Delaying before reconnect: 24]
Не используйте ftp. Проблема, с которой вы сталкиваетесь, скорее всего связана с общей путаницей направления соединения в FTP. FTP использует два порта: одно командное соединение и одно соединение для передачи данных. Традиционно соединение с командами было от клиента к серверу, а соединение данных с сервера на клиент!
PASV - противоположное; он инструктирует сервер прослушивать подключение к данным от клиента и сообщать клиенту, что это номер порта. Похоже, что это (неожиданное для многих) поведение - это то, что вас кусает.
Однако, по-моему, продолжение использования FTP сегодня не является хорошей альтернативой. Это просто устаревший, безопасный и разумный протокол.
У вас есть несколько альтернатив FTP. Если вы используете аутентификацию, scp / sftp является хорошей альтернативой. Для этого требуется ровно один порт, он аутентифицирован и зашифрован.
Если вам нужны анонимные сообщения, http (s) является хорошей альтернативой. Или через запрос POST, либо с помощью WebDAV. Http также может быть настроен на использование аутентификации и может быть зашифрован с помощью TLS (https). Он также открывает только один канал для данных и команд.
FTP - это протокол 40 лет. Это выходит из употребления, и, как следствие, программное обеспечение не получает такого большого внимания, как более популярные веб-серверы и ssh-серверы, и, следовательно, существует более высокая вероятность серьезных уязвимостей, сохранившихся в исходном коде.
Кроме того команда для SCP'ing будет намного проще: scp * $user@$host:$targetfolder - и вы можете использовать аутентификацию на основе ключа, чтобы избежать паролей в скрипте!
Не используйте ftp. Проблема, с которой вы сталкиваетесь, скорее всего связана с общей путаницей направления соединения в FTP. FTP использует два порта: одно командное соединение и одно соединение для передачи данных. Традиционно соединение с командами было от клиента к серверу, а соединение данных с сервера на клиент!
PASV - противоположное; он инструктирует сервер прослушивать подключение к данным от клиента и сообщать клиенту, что это номер порта. Похоже, что это (неожиданное для многих) поведение - это то, что вас кусает.
Однако, по-моему, продолжение использования FTP сегодня не является хорошей альтернативой. Это просто устаревший, безопасный и разумный протокол.
У вас есть несколько альтернатив FTP. Если вы используете аутентификацию, scp / sftp является хорошей альтернативой. Для этого требуется ровно один порт, он аутентифицирован и зашифрован.
Если вам нужны анонимные сообщения, http (s) является хорошей альтернативой. Или через запрос POST, либо с помощью WebDAV. Http также может быть настроен на использование аутентификации и может быть зашифрован с помощью TLS (https). Он также открывает только один канал для данных и команд.
FTP - это протокол 40 лет. Это выходит из употребления, и, как следствие, программное обеспечение не получает такого большого внимания, как более популярные веб-серверы и ssh-серверы, и, следовательно, существует более высокая вероятность серьезных уязвимостей, сохранившихся в исходном коде.
Кроме того команда для SCP'ing будет намного проще: scp * $user@$host:$targetfolder - и вы можете использовать аутентификацию на основе ключа, чтобы избежать паролей в скрипте!