Il y a peu j’ai eu à mettre en place un transfert quotidien depuis un serveur FTP distant jusqu’à un serveur de fichiers local. Premièrement, ayant un Windows Serveur 2008 R2 sur le serveur local, la question de l’exécution quotidienne de la tâche ne se posait pas : Planificateur de tâches ! Cet outil d’administration est l’équivalent du « cron » dans un environnement Linux, et permet de gérer énormément de paramètres et de conditions à l’exécution redondante d’une tâche.
Ce qui allait poser plus de problème, c’était le script.
Bon, je me suis tout d’abord orienté vers FTP.exe, le client FTP par défaut de Windows, qui fonctionne d’ailleurs très bien. Mais dans mon cas, comme le serveur distant ne fonctionnait pas en mode « passif », c’est à dire qu’il utilise plusieurs ports pour les transferts et pas seulement le port 21, je n’ai pas pu mettre ceci en place. Si toutefois vous voulez quelques explications :
Utilisation de FTP.exe
On peut utiliser FTP.exe depuis une invite de commande, et celui-ci peut se connecter à un serveur de la façon suivante :
- On entre la commande suivante :
ftp -s:chemin_fichier\mon_fichier.txt
- Le fichier en question, est un fichier contenant les informations nécessaires à la connexion :
open nom_dhote nom_dutilisateur mot_de_passe
Dans ce même fichier, à la suite, on précise quel mode de transmission on désire : binary ou ascii :
bin :: pour binary ascii :: pour ascii
Ensuite, il suffit de monter le répertoire de destination/source, (selon si on veut copier ou récupérer des fichiers) du côté serveur ftp, avec un cd. Par exemple :
cd /home/documents
Ensuite on monte le répertoire local dans lequel on veut récupérer/copier les fichiers, du côté client ftp, grâce à :
lcd C:\Windows\docs
Et pour finir on execute notre transfert grâce à mput ou mget :
- Ici, on va copier depuis C:\Windows\docs tout les fichiers .txt sur le serveur, dans /home/documents
mput *.txt
- Ici, on va copier depuis /home/documents tout les fichiers .gif sur le client, dans C:\Windows\docs
mget *.gif
Bon, et on oublie pas de terminer en disant « bye » ! Non, sans rire, pour couper les connexions, il faut réellement préciser l’instruction bye.
Au final notre fichier mon_fichier.txt donnera ceci (en exemple pur) :
open ftp.chateauversailles louis14 secret bin cd /var/www/html lcd C:\wamp\www mget * bye
On récupère depuis le ftp, tout le contenu de /var/www/html et on le copie dans C:\wamp\www.
Mais bon, FTP.exe ne supporte pas le mode passif, donc j’ai du me tourner vers ncftp.exe.
Utilisation de ncFTP.exe
ncFTP.exe est un logiciel gratuit, non-natif à Windows.
On peut donc télécharger ncFTP ici : http://www.ncftpd.com/ncftp/ et utiliser les petits programmes fournis avec, à savoir ncftpget.exe ou ncftpput.exe, dans des scripts assez facilement.
La doc est ici :
- Pour ncFTPget : http://www.ncftpd.com/ncftp/doc/ncftpget.html
- Pour ncFTPput : http://www.ncftpd.com/ncftp/doc/ncftpput.html
Mais pour donner un petit exemple d’utilisation de récuperation de fichiers sur un FTP:
@echo off %windir%\ncftpget.exe –f nom_fichier_connexion –d fichier_log repertoire_destination repertoire_source/fichier(s)
- Ici, %windir%\ncftpget, permet l’éxécution depuis n’importe ou, car à l’installation, ncFTP marque son répertoire dans la variable d’environnement %windir%.
- -f nom_fichier_connexion : pointe vers un fichier qui contient les infos de connexion sous la forme :
open nom_dhote user nom_user pass mot_de_passe
- -d fichier_log : n’est pas obligatoire, mais conseillé pour debugger d’éventuels problemes, qui seront majoritairement affichés dans ce fichier_log.
- Et pour le reste nous avons la destination et la/les sources, séparées par un espace, ce qui n’est pas trop compliqué :p
Note : Attention à toujours utiliser les chemins complets (absolus) dans ce genre de script !
Et pour moi, après maints essais, plus de problèmes ! Ce logiciel très pratique me permet, lié au Plannificateur de tâches Windows, d’invoquer tout les jours en pleine nuit une copie de mes fichiers depuis mon serveur FTP.
Bonjour,
Cette solution est-elle fiable à 100% ?
J’ai essayé de reproduire la même chose (à quelques lignes près), mais ça ne fonctionne pas comme il faut.
Déjà, le login et le mot de passe ne sont pas pris en compte (alors qu’il sont renseignés juste après la connexion au serveur FTP).
Je suis pourtant bien connecté au serveur FTP, je veux que mon script transfert tous les fichiers en .csv vers le serveur (ayant précisé le chemin absolu), mais il ne transfert qu’un seul fichier. Donc, cette solution ne marche pas ; alors que j’avais bien fait un « mput *.csv » dans le fichier de config.
Bonjour,
Normalement si mes souvenirs sont bons, on peut passer un wildcard (*) et donc mput *.csv devrait marcher. A l’époque je n’avais utilisé que le mget mais j’imagine que mput doit avoir la même syntaxe. A mon avis le problème viens effectivement de la connexion, le fichier transféré est-il complet ?
D’accord. Oui, les fichiers sont complets, le problème ne vient pas de là. Quant aux identifiants de connexion, je retire ce que j’ai dit. En fait, c’était bon.
Par contre, je souhaite transférer tous mes fichiers
sur un serveur FTP (donc dans un dossier à distance
accessible sur mon poste).
Est-ce que votre exemple marche aussi pour ce cas de figure ?
Merci pour ces lignes de codes qui marchent parfaitement dans mon cas.
Mon seul soucis, si les fichiers sont déjà présents ils sont une nouvelle récupérés de mon ftp.
J’ai vu que l’on pouvait mettre en argument skip pour ignorer des fichiers déjà présent mais ça ne marche pas.
Dois-je utiliser rsync ou winscp?
Par avance merci