web-dev-qa-db-ja.com

vsFTPdを介してファイルのチェックサムを取得する

ローカルサーバーからファイルのバックアップを自動的にダウンロードするためのスクリプトを作成しています。ファイルがたくさんあるので、変更されていないファイルをダウンロードしないように、何かをダウンロードする前に、リモートファイルハッシュとローカルファイルハッシュを比較したいと思います。ただし、vsFTPdサーバーでHASHコマンドを使用できません。

これは、HASHコマンドが何らかの理由で無効または禁止されていることを意味しますが、何時間もグーグルで有効にする方法を教えていないか、vsFTPdがHASHコマンドをまったくサポートしているかどうかはわかりません。

これが可能かどうか誰にもわかりますか?あるいは、vsFTPdがHASHコマンドをサポートしていない場合、Ubuntu用の別のFTPサーバーを使用できますか?

以下に例を示します。

erlend@server:~$ ftp localhost
Connected to localhost.localdomain.
220 (vsFTPd 3.0.3)
Name (localhost:erlend): erlend
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 EPRT command successful. Consider using EPSV.
150 Here comes the directory listing.
-rw-r--r--    1 1002     1002       102653 Oct 05 08:19 myfile.Zip
226 Directory send OK.

しかし、ファイルハッシュを取得しようとすると、次のようになります。

ftp> HASH  myfile.Zip
?Invalid command

コメントで示唆されているように、引数なしで(そして小文字!)試してみました:

ftp> hash
Hash mark printing off.
ftp> hash
Hash mark printing on (1024 bytes/hash mark).
ftp> hash 1
Hash mark printing on (1 bytes/hash mark).
ftp> hash 2
Hash mark printing on (2 bytes/hash mark).
ftp> hash
Hash mark printing off.
ftp> hash myfile.Zip
Hash mark printing off.
3
Erlend D.

サーバーには、/etc/cron.dailyで毎日実行されるcronジョブがあります。特別なcrontabマジックを行う必要はありません。単純に実行可能なスクリプトがあります。

以下は、ファイルのハッシュ和を計算するためにすでに便利なものです。

#!/bin/bash

    md5sum \
        install.sh \
        eyesome.sh \
        eyesome-cfg.sh \
        eyesome-src.sh \
        eyesome-Sun.sh \
        wake-eyesome.sh \
        start-eyesome \
        daily-eyesome-Sun \
        systemd-wake-eyesome \
        acpi-lid-eyesome.sh \
        acpi-lid-event-eyesome \
        eyesome-dbus.sh \
        > eyesome.md5

したがって、ファイルeyesome.md5をリモートマシンにダウンロードします。

$ cat eyesome.md5
2627fe73a1c99c1ec02a17002cf88dad  install.sh
62999343cd603c4bff70e890367739bb  eyesome.sh
c42766c412b31c45d814efea36c1021b  eyesome-cfg.sh
8e56b945b9173dee4cceecb1b111b28a  eyesome-src.sh
d70ca24ca2aea58b043d86e9bdd15c0e  eyesome-Sun.sh
28b0fde9a98933fee0226c49350fdc6c  wake-eyesome.sh
712eff1f4ec14fbf04521674c32aa5b8  start-eyesome
0cdc4dbb0a383cd97f1e6d0744a6f8e4  daily-eyesome-Sun
5a2abb831f31a7339270868ddd37f745  systemd-wake-eyesome
e06f195dcf254d65b4f8512d46e44458  acpi-lid-eyesome.sh
8ce2412bdb1bab4bca6e4921f9ae282b  acpi-lid-event-eyesome
54e3052f12ca33fc53e38b01d4dd05d6  eyesome-dbus.sh

注:ファイル名の前にパスが付いている場合、sedgrepまたは別のユーティリティを使用して、サーバーのパスからローカルパスに変更する必要があります。

次に実行します:

$ md5sum -c eyesome.md5
install.sh: OK
eyesome.sh: OK
eyesome-cfg.sh: OK
eyesome-src.sh: FAILED
eyesome-Sun.sh: OK
wake-eyesome.sh: FAILED
start-eyesome: OK
daily-eyesome-Sun: OK
systemd-wake-eyesome: OK
acpi-lid-eyesome.sh: OK
acpi-lid-event-eyesome: OK
eyesome-dbus.sh: OK
md5sum: WARNING: 2 computed checksums did NOT match

失敗するファイル(eyesome-src.shおよびwake-eyesome.sh)をダウンロードする必要があります。

0

HASHの比較に関する質問には答えられませんが、コメントするには長すぎます。

ファイルを2回ダウンロードしないようにする場合は、ほとんどの場合、異なる変更時間または異なるサイズのファイルをダウンロードするだけで十分です。この場合、 この回答lfpt の使用が役立ちます。

mirrorオプションを使用して、FTPフォルダーとローカルフォルダーの同期を維持し、変更されたファイルのみをダウンロードします。

リンクされた回答 GabrieleVから:

#!/bin/bash    
Host="your.ftp.Host.dom"
USER="username"
PASS="password"
FTPURL="ftp://$USER:$PASS@$Host"
LCD="/path/of/your/local/dir"
RCD="/path/of/your/remote/dir"
#DELETE="--delete"
lftp -c "set ftp:list-options -a;
open '$FTPURL';
lcd $LCD;
cd $RCD;
mirror --reverse \
       $DELETE \
       --verbose \
       --exclude-glob a-dir-to-exclude/ \
       --exclude-glob a-file-to-exclude \
       --exclude-glob a-file-group-to-exclude* \
       --exclude-glob other-files-to-exclude"

警告:ターゲットディレクトリが存在することを確認してください。存在しない場合、cdコマンドは失敗するため、操作のツリーの削除を含むfilesは間違ったディレクトリ(ルート)で行われます!

0
Katu