Я делаю сценарий для того, чтобы автоматически загрузить резервное копирование файлов от локального сервера. Существует много файлов, так чтобы не загружать неизменные файлы, я хочу сравнить удаленный хеш файла с локальным хешем файла прежде, чем загрузить что-либо. Однако я не могу использовать команду HASH на своем vsFTPd сервере.
Я предполагаю, что это означает, что команда HASH так или иначе отключена или запрещена, но часы поиска с помощью Google должны все же сказать мне, как включить его, или если vsFTPd поддерживает команду HASH вообще.
Кто-либо знает, возможно ли это? С другой стороны, если vsFTPd не поддерживает команду HASH, есть ли другой FTP-сервер для Ubuntu, которую я могу использовать?
Вот пример:
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
. Никакое специальное предложение 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
) необходимо загрузить.
Это не ответит на Ваш вопрос о сравнении ХЕША, однако, является слишком длинным для комментария.
Если Вы не хотите загружать файлы дважды, загружая файлы, которые имеют другое время изменения, или другой размер должен быть достаточно в большинстве ситуаций. Если это верно, этот ответ об использовании 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 перестанет работать, таким образом, операция включая удаление деревьев файлов произойдет в неправильном каталоге (корень)!