SFTP:ダウンロードが正しいことを確認する

SFTP:ダウンロードが正しいことを確認する

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つあります。

  1. 使用sshfssftp ディレクトリをシステムのどこかにマウントします。その後、cpなどの標準のUNIXコマンドを使用してmvファイルを移動できます。これが最善の選択です。rmrsync

  2. SFTPライブラリを含む言語(PerlやPython、最も一般的で現在コンパイルされている言語)を使用してリモートサーバーに接続するプログラムを作成し、次の手順を実行します。

    • 転送するファイルのリストを取得する
    • 各ファイルに対して、次の操作を行います。
      • ダウンロード
      • どういうわけか(例:@thrigはmd5sumファイルまたは類似のファイルを使用することを提案しています)
      • よかったらリモートサーバーから削除してください

おすすめ記事