Je fais un script pour télécharger automatiquement une sauvegarde de fichiers à partir d'un serveur local. Il y a beaucoup de fichiers, donc pour éviter de télécharger des fichiers non modifiés, je souhaite comparer le hachage de fichier distant au hachage de fichier local avant de télécharger quoi que ce soit. Cependant, je ne peux pas utiliser la commande HASH sur mon serveur vsFTPd.
Je suppose que cela signifie que la commande HASH est en quelque sorte désactivée ou interdite, mais des heures passées à googler doivent encore me dire comment l'activer ou si vsFTPd prend en charge la commande HASH.
Est ce que quelqu'un sait si c'est possible? Sinon, si vsFTPd ne prend pas en charge la commande HASH, existe-t-il un autre serveur FTP pour Ubuntu que je peux utiliser?
Voici un exemple:
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.
Mais lorsque j'essaie d'obtenir le hachage du fichier, je reçois:
ftp> HASH myfile.Zip
?Invalid command
Essayé sans argument (et minuscule!) Comme suggéré dans les commentaires:
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.
Sur votre serveur, un travail cron est exécuté quotidiennement dans /etc/cron.daily
. Aucune magie spéciale crontab
n'a besoin d'être faite. Simplement mais un script exécutable ici.
En voici un que j’ai déjà sous la main pour calculer des sommes de hachage sur des fichiers:
#!/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
Ainsi, vous téléchargeriez le fichier eyesome.md5
sur votre ordinateur distant.
$ 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
Remarque: Si vos noms de fichiers sont préfixés par un chemin, vous devrez peut-être le changer du chemin du serveur vers votre chemin local avec sed
, grep
ou un autre utilitaire.
Puis lancez:
$ 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
Les fichiers qui échouent (eyesome-src.sh
et wake-eyesome.sh
), vous devez télécharger.
Cela ne répondra pas à votre question sur la comparaison de HASH, mais est trop long pour un commentaire.
Si vous souhaitez éviter de télécharger deux fois des fichiers, le téléchargement de fichiers avec une heure de modification ou une taille différente devrait suffire dans la plupart des situations. Si tel est le cas, cette réponse sur l'utilisation de lfpt sera utile.
Il utilise l'option mirror
pour synchroniser votre dossier FTP et vos dossiers locaux en ne téléchargeant que les fichiers modifiés.
De la réponse liée par 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"
Avertissement: assurez-vous que le répertoire cible existe, sinon la commande cd échouera. L'opération , y compris la suppression des arbres de les fichiers auront lieu dans un mauvais répertoire (racine)!