Calcul de checksum en passant par SFTP

Résolu/Fermé
drumjoel Messages postés 52 Date d'inscription mercredi 18 avril 2012 Statut Membre Dernière intervention 8 septembre 2014 - 3 mai 2012 à 13:47
drumjoel Messages postés 52 Date d'inscription mercredi 18 avril 2012 Statut Membre Dernière intervention 8 septembre 2014 - 3 mai 2012 à 16:43
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.


#!/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

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
3 mai 2012 à 14:06
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...
0
drumjoel Messages postés 52 Date d'inscription mercredi 18 avril 2012 Statut Membre Dernière intervention 8 septembre 2014 2
3 mai 2012 à 14:16
Ok, merci de la rapidité
je marque donc comme résolus.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
3 mai 2012 à 14:19
Attends tout de même d'autres avis, j'avais bien précisé : "je ne pense pas que ce soit possible.", sans être catégorique à 100% ;-\
0
drumjoel Messages postés 52 Date d'inscription mercredi 18 avril 2012 Statut Membre Dernière intervention 8 septembre 2014 2
3 mai 2012 à 16:42
Ben mes recherche poussait dans ton sens donc j'en ai conclu que tu avais raison
0
drumjoel Messages postés 52 Date d'inscription mercredi 18 avril 2012 Statut Membre Dernière intervention 8 septembre 2014 2
3 mai 2012 à 16:43
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	
0