Automatiser une copie SFTP avec WinSCP et vérifier la sauvegarde

Tu veux rapatrier régulièrement les fichiers d’un site sur un PC Windows. WinSCP peut automatiser ce transfert. Pour en faire une sauvegarde exploitable, il faut aussi contrôler le résultat, conserver des versions et prévoir séparément les données qui ne sont pas dans ces fichiers.

⚡ TL;DR — L’ESSENTIEL EN 30 SECONDES

  • ✅ Utilise une connexion SFTP avec une empreinte serveur vérifiée.
  • ✅ Chaque exécution peut écrire dans un nouveau dossier daté.
  • ✅ Le code de retour et le journal permettent de repérer un transfert en erreur.
  • ⚠️ Copier les fichiers d’un site WordPress ne sauvegarde pas sa base de données.

Mis à jour le 25 octobre 2026 à partir des sources officielles citées.

Définir ce qui doit être sauvegardé

Le guide officiel de sauvegarde WordPress (source consultée le 25 octobre 2026) distingue les fichiers et la base de données. Ce tutoriel copie une arborescence accessible en SFTP. Il ne produit pas automatiquement un export de base ni une capture cohérente de services qui écrivent pendant le transfert.

Définis le répertoire distant, l’espace local, la fréquence et la durée de conservation. Ajoute le parcours de sauvegarde de la base utilisé chez ton hébergeur. Notre guide WordPress en ligne de commande traite ce contexte serveur séparément.

Préparer une connexion vérifiée

La documentation WinSCP de la commande open (source consultée le 25 octobre 2026) prévoit une URL de session, une clé privée et l’empreinte attendue de la clé du serveur. Obtiens cette empreinte par un canal fiable auprès de l’administrateur ou de l’hébergeur ; ne remplace pas sa vérification par *.

  1. Installe WinSCP depuis son site officiel et teste la connexion manuellement.
  2. Utilise un compte disposant des seuls accès nécessaires à la copie.
  3. Prépare la méthode d’authentification autorisée par ton serveur.
  4. Dans WinSCP, utilise la génération de code de session pour limiter les erreurs de syntaxe.
  5. Vérifie les chemins locaux de WinSCP et de la clé privée.

Une tâche planifiée doit pouvoir s’authentifier sous son propre compte d’exécution. Si la clé est protégée par une phrase secrète, configure un mécanisme adapté avant de planifier. Ne recopie pas un mot de passe ou une phrase secrète dans un article, un journal ou une commande partagée.

Créer le fichier de commandes WinSCP

Crée le dossier C:\SauvegardesSite, puis le fichier backupscript.txt. L’exemple ci-dessous contient volontairement un domaine, un compte, une empreinte et des chemins à remplacer. Il ne peut pas servir tel quel à une connexion réelle.

option batch abort
option confirm off
open sftp://compte@sftp.example.invalid/ -hostkey="EMPREINTE_SHA256_A_REMPLACER" -privatekey="C:\SauvegardesSite\cle-sftp.ppk"
cd /chemin/du/site
get -transfer=binary * "%SYSKB_BACKUP_DEST%\"
exit

WinSCP documente le mode batch, les variables d’environnement et l’encodage des scripts (source consultée le 25 octobre 2026). Enregistre ce fichier en UTF-8 avec BOM. Le mode batch abort interrompt l’exécution en cas de problème ; SYSKB_BACKUP_DEST sera fourni par le lanceur.

La commande get de WinSCP (source consultée le 25 octobre 2026) télécharge les fichiers et parcourt les dossiers correspondants. Ici, elle vise le répertoire distant choisi par cd. L’exemple n’utilise pas l’option -delete et ne supprime pas les fichiers distants.

Lancer dans un nouveau dossier et contrôler le résultat

Enregistre le lanceur suivant dans LaunchBackup.ps1, au même emplacement. Adapte le chemin de WinSCP.com. Ce modèle utilise Get-Date et New-Item (documentation Microsoft consultée le 25 octobre 2026) pour créer une destination datée. Il transmet son chemin à WinSCP et conserve le journal à côté du dossier.

$ErrorActionPreference = 'Stop'
$racineSauvegarde = 'C:\SauvegardesSite'
$outilWinSCP = 'C:\Program Files (x86)\WinSCP\WinSCP.com'
$fichierCommandes = Join-Path $racineSauvegarde 'backupscript.txt'
$identifiantCopie = Get-Date -Format 'yyyyMMdd-HHmmss-fff'
$destinationCopie = Join-Path $racineSauvegarde $identifiantCopie

try {
    if (-not (Test-Path -LiteralPath $outilWinSCP -PathType Leaf)) {
        throw 'Chemin de WinSCP.com incorrect.'
    }
    if (-not (Test-Path -LiteralPath $fichierCommandes -PathType Leaf)) {
        throw 'Fichier backupscript.txt introuvable.'
    }
    New-Item -ItemType Directory -Path $destinationCopie | Out-Null
    $env:SYSKB_BACKUP_DEST = $destinationCopie
    & $outilWinSCP '/ini=nul' "/log:$destinationCopie.log" "/script:$fichierCommandes"
    if ($LASTEXITCODE -ne 0) {
        throw 'Transfert en erreur : consulte le journal WinSCP.'
    }
    Write-Output "Transfert terminé : $destinationCopie"
    exit 0
}
catch {
    [Console]::Error.WriteLine($_.Exception.Message)
    exit 1
}

WinSCP définit le code 0 comme un succès et le code 1 comme une erreur (source consultée le 25 octobre 2026). Le lanceur contrôle ce résultat avant d’annoncer la fin du transfert. Un dossier créé mais incomplet reste donc un essai à examiner, pas une sauvegarde déclarée valide.

Les options de ligne de commande WinSCP (source consultée le 25 octobre 2026) utilisées sont /script, /log et /ini=nul. Cette dernière évite de dépendre d’une configuration enregistrée ; les paramètres de connexion doivent donc être complets. Microsoft documente les différences d’encodage PowerShell (source consultée le 25 octobre 2026) : pour ce lanceur contenant des accents sous Windows PowerShell 5.1, utilise UTF-8 avec BOM. Le lanceur est un exemple à adapter et à valider dans ton environnement Windows, pas un transfert exécuté par SysKB sur ton serveur.

Tester une restauration avant de planifier

  1. Exécute le lanceur sur un répertoire distant de test.
  2. Contrôle son code de sortie et lis le journal en cas d’erreur.
  3. Compare quelques fichiers connus, leur contenu et les dossiers attendus.
  4. Restaure un fichier dans un emplacement séparé, sans écraser le site.
  5. Vérifie aussi le parcours de restauration de la base de données.

Ne supprime pas une copie utile au seul motif qu’une archive a été créée. Le parcours présenté conserve le dossier transféré ; si tu ajoutes une compression, contrôle son résultat et l’ouverture de l’archive avant toute politique de nettoyage. Protège également les copies et les journaux, qui peuvent contenir des données du site.

Planifier avec le bon compte Windows

Le guide WinSCP de planification (source consultée le 25 octobre 2026) combine son automatisation avec le Planificateur de tâches Windows. Configure un déclencheur, puis lance PowerShell avec le chemin du script. Par exemple, si tu utilises Windows PowerShell :

powershell.exe -NoProfile -File "C:\SauvegardesSite\LaunchBackup.ps1"

Dans l’action du Planificateur, renseigne l’exécutable et les arguments dans leurs champs respectifs. Respecte la politique d’exécution de ton poste. Teste ensuite la tâche avec son compte réel, notamment l’accès à la clé, au dossier et au serveur. Une exécution interactive réussie ne valide pas une autre identité.

Pour les bases du client, consulte notre présentation de WinSCP. Pour la copie indépendante et la conservation hors du PC, appuie-toi sur le guide de sauvegarde 3-2-1 et le guide Windows, IT et Sécurité.

Questions fréquentes

Cette copie sauvegarde-t-elle toute la base WordPress ?

Non. Les fichiers transférés et la base de données sont deux éléments à sauvegarder et à restaurer.

Faut-il accepter toutes les clés de serveur ?

Non. Vérifie une empreinte obtenue par un canal fiable et renseigne la valeur attendue dans la connexion.

Un dossier daté suffit-il à prouver le succès ?

Non. Contrôle le code de retour, le journal et les fichiers. Teste aussi une restauration séparée.

Pourquoi tester avec le compte de la tâche planifiée ?

Ses droits, son accès à la clé et sa configuration peuvent différer de ta session interactive.

22 commentaires sur « Automatiser une copie SFTP avec WinSCP et vérifier la sauvegarde »

  1. Complément: Pour ceux qui n’ont pas la main sur leur serveur MAIS qui ont un logiciel zip sur leur serveur mutualisé ou non (et de l’espace), ils peuvent générer un fichier qui zip le dossier et ensuite il n’y a plus qu’à le télécharger.
    De la sorte, il n’y a plus qu’à appeler par exemple la page pour générer le zip et planifier son transfert

    Exemple de fichier trouvé à l’époque:
    https://www.developpez.net/forums/d1729877/php/langage/php-zip-recursif-partir-racine/

    Répondre
  2. Suggestion: pour accélérer le traitement, je vous suggère de faire un zip du répertoire sur le serveur puis de le transférer.
    En effet, en fonction de la connexion, le téléchargement de nombreux petits fichiers peut prendre significativement plus de temps que le téléchargement d’un gros fichier.
    Bien à vous.

    Répondre
    • Bonjour YS

      Excellente suggestion, c’est d’ailleurs ce que je fais sur SysKB pour répliquer les sauvegardes sur un VPS de secours.

      En revanche pour ceux qui n’ont pas la main sur le serveur parce qu’ils louent juste un espace Web je ne crois pas que cela soit possible. Seul l’accès FTP ou SFTP est actif.

      OC.

      Répondre
  3. Bonjour,

    depuis quelques temps, mon script ne fonctionne plus. Il crée bien le zip mais il est vide.
    Lorsque je rajoute « pause » à la fin de mon fichier « .bat » et que je le lance, je vois à un moment cette remarque « No mapping for Unicode character exists in the target mutly-byte code page. The file must be in UTF-8 or UTF-16 encoding.

    Merci d’avance

    Répondre
  4. Bonjour,
    merci pour le tuto mais avec les tâches windows, la tâche ne s’execute pas. Alors que manuellement tous marche correctement.
    Y a-t’il quelque chose à régler ?
    D’avance merci,

    Paul

    Répondre
    • Par exemple sur une synchronize, manuellement il se connecte correctement et récupère les fichiers. Avec le lanceur de tâche windows, il se connecte et affiche ce message :
      Local ‘CHEMIN\bck_06052016_120543’ <= Distant 'CHEMIN'(A)bandon, (R)eprise, Pa(s)ser: Abandon. Pas de session.

      Répondre
  5. Bonjour,

    Je test de script et essaie de l'améliorer mais est-il possible d'avoir le défilement des fichiers sauvegardés à l'écran et un fichier log qui sotche tous ce qui a été copiés.

    Car lorsque j'utilise la commande >>test.log je n'ais plus l'affichage à l'ecran du déroulement de la sauvegarde.

    Merci pour votre aide.

    Répondre
  6. GG !!!

    Vraiment super ce script !

    Une question pour que ce soit parfait : est il possible de faire une analyse différencielle, pour ne backuper que les fichiers qui ont changés ?
    Ca serait parfait 🙂

    Ed

    Répondre
  7. Utilisez le fabuleux logiciel Cobian Backup qui fait tout ça à la perfection.
    http://www.01net.com/telecharger/windows/Utilit…

    (manuelle ou automatiquement) des fichiers et des dossiers de votre choix. Le répertoire de sauvegarde peut se situer en local (même PC) ou sur le réseau (autre PC). Vous pouvez programmer des sauvegardes automatiques afin qu'elles s'effectuent à des intervalles de temps réguliers. L'application peut également utiliser pkzip en tant que programme externe pour compresser vos données. Elle s'installe dans la barre des tâches à côté de l'heure, afin d'être toujours à portée de clic, et enregistre toutes les opérations exécutées dans un fichier texte.

    Répondre
    • Cobian Backup est effectivement un très bon outil, je l'utilise également pour sauvegarder mes documents sur ma freebox.

      Le but du script de ce tuto est de proposer une alternative « robuste » à l'utilisation d'une application plus exotique. Utiliser Cobian Backup pour réaliser des transferts de données automatisés en entreprise … c'est plutôt moyen et je tiens à préciser que Cobian backup 9 n'est plus en Open Source.

      C'est d'ailleurs l'inconvénient de ce type d'applications … c'est open source , open source , open source … et d'un coup ca devient PAYANT, on a rien vu venir … et on ne sait plus comment s'en passer 😉 et en entreprise réinventer la poudre ça coûte du temps et de l'argent.

      Répondre
  8. Bonjour,

    Je teste votre script avec intêret mais je me retrouve face à un code d'erreur 2. Je tente en fait de sauvegarder le répertoire distant d'un serveur. l'ouverture de session est correcte, mais le script ne trouve pas mon dossier. Que puis-je faire selon vous?

    « code demandé 11 »

    Merci

    Répondre
    • Je viens de trouver ma propre réponse.  » get /data/* « 

      Mais une autre question me vient! Je souhaite pour minimiser le trafic réseau que cette sauvegarde soit incrémentielle. Quelles modifications apporter? Un /D suffit ?

      Répondre
      • WinSCP permet de faire des transfert incrémental en comparant la source et la cible. Je pense par exemple à la commande keepuptodate. Par contre une fois les données compressées il n'y aura plus moyen de comparer.

        Une solution pourrait être de conserver un répertoire local toujours « up to date » par rapport au répertoire remote et de l'archiver / zipper de temps en temps. Concrètement le script lors de son exécution mettrait à jour un répertoire X qui ne change jamais de nom et à fin de la mise à jour ce répertoire est archivé mais pas supprimé.

        Répondre
        • Salut
          Merci pour ce tuto et heureusement que certains apportent des point de détails important pour le faire fonctionner !!!
          J'aimerai moi aussi réaliser des sauvegardes incrémentales.
          Comment réaliser cette opération ?

          Répondre
  9. bonjour,
    tout d'abord merci pour ce script, je l'ai mit en place pour mes sitres et cela fonctionne mais j'ai quand même un petit problème.
    Après plusieurs tests, il y a quelques fichiers qui ne sont pas copiés, d'ailleurs pendant l'execution du programme, la dernière colonne est des fois à 0%, je me doute que le transfert n'a pas été effectué mais pourquoi ?
    J'ai mit un timout à 3000 ? Est ce à voir ?
    Merci par avance.

    Répondre
  10. @Franck

    Bonjour, peux tu être plus explicite dans ta remarque ? De qui et de quoi parles tu ? Je suis l’auteur de l’article mais je n’arrive pas à comprendre ou tu vois : “regardez tout à l’air de fonctionner”

    Répondre
  11. franchement il as l’air bien sympa ce petit script !!

    par contre l’auteur aurais pu expliqué un peu mieux parce qu’arrivé à l’étape de lancé la sauvegarde il nous sort « regardez tout à l’air de fonctionner » t’es gentil toi mais ta fais comment pour qu’il te sorte ça en ligne de commande ?

    enfin bref on va se débrouillé c’est quand même deja un bon debut!

    Répondre
  12. Dans backupscript.txt à la place de “get /site/images” j’ai mis “/*.*”

    Il faut mettre « get /site/images/* »

    Répondre
  13. Bonjour,

    j’ai mis en place le script, mais j’ai une petite question :

    Dans backupscript.txt à la place de « get /site/images » j’ai mis « /*.* » pour esperer copier tous les fichiers, dossiers et sous dossiers, cependant je ne copie pas tout ainsi. Auriez vous une idée? Merci d’avance

    Répondre

Laisser un commentaire