私は、複数の Raspberry Pi がセンサー データを収集し、それを 1 日に数回、複数のファイルに記録するプロジェクトに取り組んでいます。crontab を使用して、1 日の終わりにすべてのファイルを FTP サーバーにアップロードする小さなスクリプトを作成したいと考えていました。そこで、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 は、コマンド接続とデータ接続の 2 つのポートを使用します。従来、コマンド接続はクライアントからサーバーへ、データ接続はサーバーからクライアントへでした。
PASV はその逆で、サーバーにクライアントからのデータ接続をリッスンするように指示し、クライアントにポート番号を伝えます。この (多くの人にとって予想外の) 動作が問題となっているようです。
しかし、私の意見では、FTP を使い続けることは、今日では良い選択肢ではありません。セキュリティ面でもプロトコル面でも、FTP は単純に時代遅れです。
FTP の代替手段はいくつかあります。認証を使用する場合、scp/sftp は適切な代替手段です。必要なポートは 1 つだけで、認証され、暗号化されます。
匿名での送信が必要な場合は、http(s) が適しています。POST リクエストまたは WebDAV のいずれかを使用します。Http はまた認証を使用するように設定でき、TLS (https) で暗号化できます。また、データとコマンドの両方に対して 1 つのチャネルのみが開かれます。
FTP は 40 年前のプロトコルです。使用されなくなっており、その結果、このソフトウェアはより一般的な Web サーバーや SSH サーバーほど注目されなくなり、ソース コードに深刻な脆弱性が残る可能性が高くなります。
さらに、SCP のコマンドははるかに簡単になります。scp * $user@$host:$targetfolder
- キーベースの認証を使用して、スクリプト内でパスワードを回避することもできます。