Récupération SFTP automatique sous Windows avec WinSCP

Script SFTP automatique d’un serveur GNU/Linux distant sous Windows avec les fonctionnalités de scripting de WinSCP.

Il y a quelque temps maintenant je suis passé à un serveur Kimsufi SSD, ce qui a bien augmenté ses performances  au détriment de la capacité de stockage. Mon plan de sauvegarde (du système et des sites hébergés) a donc été modifié pour garder moins de backups sur le serveur en supprimant les plus anciens. Suite à ce constat, j’ai décidé d’automatiser le téléchargement des backups sur ma machine locale, mais sous Windows on a pas facilement un rsync ou du ssh à porté de main. Après un peu de recherche j’ai découvert que le client FTP/SFTP WinSCP était facilement scriptable, ceci ajouté à une tâche planifiée, j’avais ma solution de download de sauvegardes sous Windows.

Le principe est très simple, nous allons écrire un script WinSCP qui sera appelé par un batch Windows.

Script WinSCP

Voici un exemple de scripting WinSCP, à mettre dans un fichier texte genre backup_ftp.txt  :

open sftp://username:xxxxxxx@monserveur.net/ 
    -hostkey="ssh-rsa 2048 fc:6d:bc:4d:76:9d:08:4e:7e:31:56:45:d9:a4:97:22"
cd /home/username/backups/
option transfer binary
get -neweronly *.tgz c:\Users\win-username\backups\
close
exit

 

Plutôt explicite non? Ligne par ligne :

  1. Ouverture d’une session SFTP sur le serveur distant.
  2. Déplacement dans le répertoire des fichiers à récupèrer.
  3. Quelques options de transfert.
  4. On récupère les nouveaux fichiers uniquement ayant l’extension TGZ avec la commande get
  5. On ferme la connexion.

Pour la partie hostkey de l’ouverture de session, WinSCP permet de facilement la trouver. Pour cela il faut se connecter sur le serveur, puis aller dans Session > Informations sur le serveur/protocole et dans le premier onglet, il suffit de recopier la valeur sous Empreinte digitale du serveur hôte.

Trouver la clé du serveur dans WinSCP
Trouver la clé du serveur dans WinSCP

 

 

 

 

 

 

 

 

 

 

Les scripts WinSCP permettent de faire beaucoup de choses, se référer à la liste des commandes disponibles pour avoir un aperçu exhaustif des possibilités.

Script CMD

Le script Windows va invoquer la commande winscp.exe  avec en option le chemin vers notre fichier de script, je l’ai nommé download_backups.cmd  :

"C:\Program Files (x86)\WinSCP\winscp.com" 
    /script=C:\Users\win-username\bin\backup_ftp.txt

 

C’est tout. Pour l’automatisation, il suffit de créer une tâche planifiée qui exécute notre script download_backups.cmd.

Plus tard nous verrons comment ajouter un log et envoyer le rapport par email en fin de récupération.

13 réflexions sur « Récupération SFTP automatique sous Windows avec WinSCP »

  1. Bonjour
    merci pour votre tuto mais pour un débutant j’aimerai savoir les étapes à suivre pour creer ces fichier .txt pour le scrypting et comment pouvoir les exécuter si c’est possible en détail merci à vous à savoir je suis débutante dans ts ça merci pour votre aide
    Cdlt

    1. Hello Reda, merci pour ton message.
      Qu’est ce que tu ne comprends pas ? As-tu créé les fichiers backup_ftp.txt et download_backups.cmd (en adaptant leur contenu pour tes besoins bien sur) ? Ensuite, tu doubles-clic sur le fichier download_backups.cmd pour l’exécuter.

  2. Merci pour votre réponse,
    voila donc en détail j’ai installer le WinScp apres j’ai créer un fichier .init en allant sur Option<<preference<<puis j'ai cocher sur enregistrement INI file qui se genere donc j'ai mis une copie à la racine C et une autre dans le dossier "C:\Program Files (x86)\WinSCP" en ajoutant un fichier winscp.txt ( ou j'ai ecrit ces instructions que j'ai trouver dans un autre site le voici http://www.tutos.eu/?n=5458 ) : donc j'ai mis en commentaire ce que j'ai pas compris
    winscp.txt /
    open sftp://username:xxxxxxx@monserveur.net/ """"""qu'est ce que je doit mettre ici le nom de mon raspberry??"""""
    # Interface 1
    cd /MonRepertoireSurServeurFTP ''''' j'ai pas compris cette commande""""
    lcd "C:\Repertoire sur disque local"
    #Copie des données en local
    get *.* ici je sais pas comment ecrire pour récuperer un dossier sous mon raspberry qui contient des photos
    # Disconnect
    close
    # Exit WinSCP
    exit

    puis j'ai creer comme vous l'avez dis le fichier.bat pour lancer le fichier.init et exécuter le .txt

    le fichier.bat
    "C:\Program Files (x86)\WinSCP\WinSCP.com" /ini=C:\WinScp.ini /console /script=C:\WinScpScript.txt
    mais quand j'excute ya rien qui se passe est ce qu'il faut mettre tous les fichier.txt .bat et . ini dans le meme dossier ou dans la racine C pour l'excusion
    merci j’espère que j'ai bien expliquer mon problème

    1. Je ne comprends pas la partie de création d’un fichier .ini. C’est inutile. Il suffit d’avoir WinSCP d’installé, rien à faire où à générer côté WinSCP.
      Pour prendre un exemple concret, dans mon cas les 2 fichiers (backup_ftp.txt et download_backups.cmd) sont dans un dossier bin dans mon dossier utilisateur, donc sous C:\Users\fabien\bin.
      Dans le fichier .txt, les lignes que tu n’as pas compris :

      open sftp://username:xxxxxxx@monserveur.net/
      Oui tu mets l’IP de ton RaspberryPi à la place de serveur.net, tu mets le nom d’utilisateur et le mot de passe de l’utilisateur du RaspberryPi.

      cd /MonRepertoireSurServeurFTP
      C’est pour se déplacer dans le répertoire sur le RaspberryPi que tu veux sauvegarder. Je ne le connais pas, donc tu adaptes, exemple : cd /home/username/photos/

      get *.*
      A cette étape, tu es dans le bon répertoire photos, donc tu te bornes à récupérer tout ce qu’il y a dedans avec cette commande get.

  3. D’accord donc les fichier je peux les mettre ou je veux l’essentiel lorsque je fais apel aux 2fichiers faut bien inscrire le chemin , et pour le get *.* donc j’ecris
    get c:\Users\USER\Desktop\plani
    afin de prendre le fichier de mon raspberry et le trasferer dans le dossier plani sur mon bureau est t il correcte
    merci pour votre aide

  4. Bonjour,
    je vous remercie par avance pour votre aide.
    j’ai suivi a la lettre votre script WinScp pour automatiser le transfert des BDD avec winscp, sauf qu’après exécution, je rencontre un problème : Erreur 3
    le fichier ne peut pas etre créé . Erreur Système . code :3
    le chemin d’aces spécifie est introuvable.

    pourtant, et a travers l’interface WinScp, le transfert est possible.
    merci de m’aider.

    1. Hello Sidali,
      Le problème vient d’un soucis de chemin ou de permissions. Dans l’exemple de l’article, il faut que le script puisse écrire dans le répertoire c:\Users\win-username\backups\. As-tu vérifié ceci ?

      1. Bonjour Mr. FABIEN et merci pour votre réponse.
        au fait, j’ai mal écrit le nom du répertoire de destination. problème réglé. par contre mon souhait c’est de récupérer un répertoire a partir de mon serveur AIX vers mon serveur Windows via un script WinScp.
        est il possible de me faire part d’un script pour transférer un répertoire au lieu des fichiers *.dmp ?
        je vous remercie d’avance.
        cordialement.

        1. La commande get permet de télécharger des fichiers aussi bien que des répertoires, il ne devrait donc pas y avoir de problème. Par exemple :

          get -neweronly /mon/repertoire/ c:\Users\win-username\backups\
          

          Sinon il peut également être intéressant aller voir du côté de la commande synchronize pour synchroniser des répertoires.

  5. Merci Mr.FABIEN,
    j’ai pu recuperer tout le repertoire. j’ai un autre souci, je profite de votre gentillesse pour vous dire qu’n genernt un fichier cmd afin d’executer le scritp, un probleme surgit. ci dessous la commande ainsi que le resultat de la commande.

    C:\> »C:\Program Files (x86)\WinSCP\winscp.com » C:\backup_ftp.txt

    Ouvrir une session en utilisant un paramètre de la ligne de commande est dépréci
    é. Utilisez la commande ‘open’ à la place.
    Recherche de l’hôte…
    L’hôte « C » n’existe pas.
    winscp>

    merci de m’instruire afin de construire l’automatisation de mon script

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *