SFTP接続から一部のデータをダウンロードし、そのFTPからデータを削除する必要があります。ただし、データが正しくダウンロードされたことを確認する必要があります。
現在私はcronが実行しているスクリプトでこれを行います。
sftp -oIdentityFile=key user@server <<EOF
mget -r *
mdelete *
bye
EOF
ただし、FTP接続は次のコマンドのみを実行し、操作が失敗した後に接続を中断しないため、何らかの理由でダウンロードが中断された場合、どうせファイルが削除されるのか心配です。
可能であれば、ハッシュ比較を実行してファイルが正しくダウンロードされたことを確認する必要があります。しかし、FTPがこの機能を提供しているかどうかは非常に疑わしいので、この問題に対する最善の解決策は何ですか?
これが不可能な場合:すべてのファイルをFTPサーバーに保存し、新しいファイルのみをダウンロードすることが回避策かもしれません。これがより簡単な解決策のようです。このソリューションの提案はありますか?
編集:サーバーには影響しないため、すべてのファイルを削除する前にダウンロードできる最も実用的なソリューションを探しています。私はデータ自体の整合性についてあまり心配しません(私はSSHを信頼しています)。
答え1
あなたのような単純なスクリプトは、高速で汚れたインポートsftp
スクリプトには適していますが、それを使用してファイルを削除(特にワイルドカードを削除)すると、災害が発生します。
スクリプトの非常に明白なリスクは、mdelete *
ランタイムディレクトリのファイルだけでなく、mget -r *
実行後にソースディレクトリにアップロードされたファイルも削除することです。mget
でも。mget
利用可能な他の(より安全な)オプションがいくつかあります。以下は2つあります。
使用sshfssftp ディレクトリをシステムのどこかにマウントします。その後、
cp
などの標準のUNIXコマンドを使用してmv
ファイルを移動できます。これが最善の選択です。rm
rsync
SFTPライブラリを含む言語(PerlやPython、最も一般的で現在コンパイルされている言語)を使用してリモートサーバーに接続するプログラムを作成し、次の手順を実行します。
- 転送するファイルのリストを取得する
- 各ファイルに対して、次の操作を行います。
- ダウンロード
- どういうわけか(例:@thrigはmd5sumファイルまたは類似のファイルを使用することを提案しています)
- よかったらリモートサーバーから削除してください