Calcul de checksum en passant par SFTP
Résolu
drumjoel
Messages postés
56
Statut
Membre
-
drumjoel Messages postés 56 Statut Membre -
drumjoel Messages postés 56 Statut Membre -
Bonjour,
J'ai créer un script qui télécharge un fichier list.txt qui contient des noms de fichier à télécharger en SFTP.
Il cherche si le fichier contenu dans list.txt est en local si oui il calcul son checksum et le compare avec celui sur le serveur distant si il sont différent on télécharge celui du serveur,
si le fichier existe pas en local on le télécharge.
Mon problème est que je passe par SSH pour calculer le checksum du fichier sur le serveur distant hors je voudrais autoriser que les connexions SFTP.
J'ai créer un script qui télécharge un fichier list.txt qui contient des noms de fichier à télécharger en SFTP.
Il cherche si le fichier contenu dans list.txt est en local si oui il calcul son checksum et le compare avec celui sur le serveur distant si il sont différent on télécharge celui du serveur,
si le fichier existe pas en local on le télécharge.
Mon problème est que je passe par SSH pour calculer le checksum du fichier sur le serveur distant hors je voudrais autoriser que les connexions SFTP.
#!/usr/bin/bash
downfile=list.txt
sftp user@192.168.0.40:$downfile #telecharge le fichier list.txt
ls | grep $downfile > /dev/null 2>&1
if [ $? -eq 0 ]; then #test la presence du fichier $downfile
cat "$downfile" | while read line
do
ls | grep $line > /dev/null 2>&1
if [ $? -eq 0 ]; then #test la presence du fichier $line
md5local=$(md5sum $line) #stocke le checksum du fichier local
md5distant=$(ssh user@192.168.0.40 -n md5sum $line) #stocke le checksum du fichier distant (serveur sftp)
while [ "$md5local" != "$md5distant" ]
do
sftp user@192.168.0.40:$line #si different on telecharge le fichier distant
md5local=$(md5sum $line) #stocke le checksum du fichier local
done
else
sftp user@192.168.0.40:$line #si le fichier n'est pas present en local on le telecharge
fi
done
else exit 1;
fi
exit 0;
3 réponses
-
Salut,
SFTP ne pouvant pas exécuter de commandes autres que celles implémentées d'origine, je ne pense pas que ce soit possible.
La seule solution envisageable est d'avoir un fichier MD5 sur le site associé à chaque fichier, que tu rapatrieras en même temps que le fichier source et tu pourras à partir de là faire ta vérification en te passant même des variables...
-
-
Voici le script que j'ai réaliser et qui fonctionne
#!/usr/bin/bash #Ce script telecharge un fichier dont le nom est stocker $downfile #le fichier $downfile contient le md5 et le nom du fichier à télécharger #si le fichier lister dans $down file n'existe pas en local ou n'a pas le meme checksum (md5) alors on le telecharge sur le serveur downfile=list_onco.txt sftp usersftp@192.168.0.40:$downfile #telecharge le fichier list_onco.txt ls | grep $downfile > /dev/null 2>&1 if [ $? -eq 0 ]; then #test la presence du fichier $downfile cat "$downfile" | while read line do md5distant=$(echo $line | cut -b1-32) #recupere le md5 du fichier distant stocker dans list_onco.txt nomFich=$(echo $line | cut -b34-) #recupere le nom du fichier stocker dans list_onco.txt ls | grep $nomFich > /dev/null 2>&1 if [ $? -eq 0 ]; then #test la presence du fichier $nomFich md5local=$(md5sum $nomFich | cut -b1-32) #si le fihchier est présent stocke le checksum du fichier local while [ "$md5local" != "$md5distant" ] #tant que le checksum local est different du checksum distant do sftp usersftp@192.168.0.40:$nomFich #on telecharge le fichier distant md5local=$(md5sum $nomFich | cut -b1-32) #stocke le checksum du fichier telecharger dans checksum du fichier local done else #si le fichier n'est pas stocker en local sftp usersftp@192.168.0.40:$nomFich #on le telecharge md5local=$(md5sum $nomFich | cut -b1-32) #calcul le md5sum local du fichier telecharger while [ "$md5local" != "$md5distant" ] #tant que le checksum local est different du checksum distant do sftp usersftp@192.168.0.40:$nomFich #on telecharge le fichier distant md5local=$(md5sum $nomFich | cut -b1-32) #stocke le checksum du fichier telecharger dans checksum du fichier local done fi done else exit; #erreur fi exit 0; #aucun erreur