ローカルサーバーからファイルのバックアップを自動的にダウンロードするためのスクリプトを作成しています。ファイルがたくさんあるので、変更されていないファイルをダウンロードしないように、何かをダウンロードする前に、リモートファイルハッシュとローカルファイルハッシュを比較したいと思います。ただし、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.
サーバーには、/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
注:ファイル名の前にパスが付いている場合、sed
、grep
または別のユーティリティを使用して、サーバーのパスからローカルパスに変更する必要があります。
次に実行します:
$ 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
)をダウンロードする必要があります。
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は間違ったディレクトリ(ルート)で行われます!