web-dev-qa-db-fra.com

Obtenir la somme de contrôle d'un fichier avec vsFTPd

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.
3
Erlend D.

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.

0
WinEunuuchs2Unix

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)!

0
Katu