IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Utilisation avancé de curl en ftp [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 87
    Par défaut Utilisation avancé de curl en ftp
    Bonjour,

    J'utilisais auparavant Cobian Backup pour la gestion de mes sauvagardes, mais il lui manque la gestion de reconnexion automatique lorsque, il y a une perte de connexion.
    Je me suis dit que j'allais testé un peu en batch ce que cela pouvait donné.

    Pour info les fichiers que j'envois représente plusieurs milliers de fichiers .txt et autres qui sont en réalité des bases de données. Cela représente 500Go de données environ.

    1) Pourriez vous me conseillé sur le bon choix des options choisit et surtout sur les temps à configurer, ou s'il vaut mieux laissé les temps par défaut.
    2) Je voudrais également en savoir plus sur la gestion des erreurs sur les fichiers non envoyé, savoir comment géré cela, les contrôles à faire.
    3) Lorsque j ajoute un répertoire avec une longue arborescence, ou sans doute un fichier trop long, le script plante sans retour d'erreur, il faut que je creuse avec l'option --traceascii


    Voici mon petit batch de test pour la gestion d'envois de fichier sur un ftp distant.
    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
    @echo off
    chcp 28591 > nul
     
    title %0 Script & Color 1A
     
    setlocal enableextensions enabledelayedexpansion
     
     
    set "FUNCTIONS_FILE=%~dp0..\5-Communs\Scripts\Functions.bat"
    set "FTP_SEND_LOG=%~dp0..\6-Logs\FtpSend.log"
    set "FTP_ERROR_LOG=%~dp0..\6-Logs\FtpError.log"
     
    REM Variable de connection FTP
    set "FTP_USER=backup"
    set "FTP_PWD=backupxxxx"
    set "FTP_IP=78.227.13.123"
    set "FTP_PORT=21021"
    set "FTP_INITIAL_DIRECTORY=/TEST/SCRIPTS/%username%/"
    Rem DOSSIER LOCAL A TRANSFERER
    set "FTP_FILE_TRANSFERT=D:\test\"
     
     
     
    REM Variable de configuration du FTP
    REM Permet de supprimer les information du shell (error + progresse bar)
    set "SILENT_MODE=0"
    Rem Durée maximale en secondes que vous autorisez à prendre toute l'opération
    set /a MAX_TIME=3600*24*7
    Rem Durée maximale en secondes que vous autorisez à prendre pour la connexion au serveur distant 
    set /a CONNECT_TIMEOUT=3600*24*1
    Rem Nombre de tentative de connexion au serveur distant
    set /a RETRY=50
    Rem Durée en secondes entre chaque des tentatives de connexion au serveur distant
    set /a RETRY_DELAY=5
    Rem Durée maximale en secondes des tentatives de connexion au serveur distant soit (50 tentatives * 5 secondes * 2 car environ 2s de test)
    set /a RETRY_MAX_TIME=50*5*2
    Rem Pour limiter la vitesse de transmition en Mo/s (en général le client à une connexion de 900 Mo/s en upload (1000* pour mettre en Mo/s)
    set /a LIMIT_RATE=1000*2000
     
     
     
     
    REM Détection des répertoires et du choix des applications pour les version 32 bits ou 64 bits
    if "%processor_architecture%" equ "AMD64" (
    	set "CURL=%~dp0..\5-Communs\Bin\Curl\curl-7.61.1_6-win64-mingw\bin\curl.exe"
    ) else (
    	set "CURL=%~dp0..\5-Communs\Bin\Curl\curl-7.61.1_6-win32-mingw\bin\curl.exe"
    )
     
     
     
     
    call :ftpSendFiles "%FTP_INITIAL_DIRECTORY%" "%FTP_FILE_TRANSFERT%"
     
     
     
     
    exit
     
     
     
     
     
    :ftpSendFiles
    Rem Initialisation du fichier de log
    call "%FUNCTIONS_FILE%" inLogFile "%FTP_SEND_LOG%" "=====================================[%date% %time:~0,2%h%time:~3,2%%time:~5,3%]====================================="
     
    set "FTP_INITIAL_DIRECTORY=%1"
    set FTP_INITIAL_DIRECTORY=!FTP_INITIAL_DIRECTORY:"=!
     
    set "FTP_FILE_TRANSFERT=%2"
    set FTP_FILE_TRANSFERT=!FTP_FILE_TRANSFERT:"=!
     
    echo FTP_FILE_TRANSFERT: !FTP_FILE_TRANSFERT!
    echo FTP_INITIAL_DIRECTORY: !FTP_INITIAL_DIRECTORY!
     
     
    if "%SILENT_MODE%" equ "0" ( 
    	set "SILENT="
    	set "SHOW_ERROR_MODE="
    ) else ( 
    	set "SILENT=--silent "
    	set "SHOW_ERROR_MODE=--show-error "
    )
    Rem --silent              Permet de supprimer la barre de progression et les erreurs
    Rem --show-error          Permet l'affichage des erreurs et aussi retourner un code erreurlevel 
    Rem --fail                Permet de retourner un code erreur > 0
    Rem --connect-timeout     Durée maximale en secondes que vous autorisez à prendre la connexion de curl
    Rem --max-time            Durée maximale en secondes que vous autorisez à prendre toute l'opération
    Rem --retry-connrefused   Permet de considérez ECONNREFUSED comme une erreur
    Rem --retry-delay         Durée en secondes à laquel sera relancée la connexion 
    Rem --retry               Permet de relancer la connexion sur une erreur transitoire X fois
    Rem --fail-early          Échec et sortie sur la première erreur de transfert détectée
    Rem --ftp-create-dirs     Permet de créer des répertoires manquants
    Rem --trace <file>        Active un dump de trace complet de toutes les données entrantes et sortantes, y compris les informations descriptives, dans le fichier de sortie donné. 
    Rem --trace <file>        Utilisez "-" comme nom de fichier pour que la sortie soit envoyée à stdout. Utilisez "%" comme nom de fichier pour que la sortie soit envoyée à stderr. 
    Rem --limit-rate          Permet delimiter le transfert en MB (il faudrait faire untest de bande passante pour transferer à 50% du débit du client
    Rem --remote-name, -O     curl -u ftpuser:ftppass -O ftp://ftp_server/dossier/
    Rem --upload-file, -T      "{fichier1,fichier2}" pour plusieurs fichier.
     
     
    rem  On met dans une variable OPTION toute les options de curl
    set "OPTION=%SILENT%%SHOW_ERROR_MODE%--fail --limit-rate %LIMIT_RATE% --connect-timeout %CONNECT_TIMEOUT% --max-time %MAX_TIME% --retry-connrefused --retry-delay %RETRY_DELAY% --retry-max-time %RETRY_MAX_TIME% --retry %RETRY% --fail-early --ftp-create-dirs"
     
     
     
    set FILE_TO_SEND=""
    Rem lister les fichiers au format fichier1, fichier2, fichier3
    for /R "%FTP_FILE_TRANSFERT%" %%a in ("*.*") do (
    	set "FILE=%%a"
    	Rem Pour curl on modifie les répertoires avec un double \\ c:\\test\\fichier1.txt
    	set FILE=!FILE:\=\\!
    	if "!FILES_TO_SEND!" equ "" ( 
    		set "FILES_TO_SEND=!FILE!" 
    	) else ( 
    		set "FILES_TO_SEND=!FILES_TO_SEND!,!FILE!"
    	)
    )
     
    rem https://stackoverflow.com/questions/936108/how-to-script-ftp-upload-and-download
     
     
    if exist "%FTP_FILE_TRANSFERT%*.*" (
    		echo This rep exist: %FTP_FILE_TRANSFERT%
    		rem  [!FILES_TO_SEND!]
    		REM Envoi de chaque fichier sur le ftp
    		"%CURL%" %OPTION% -u "%FTP_USER%:%FTP_PWD%" -T "{!FILES_TO_SEND!}" "ftp://%FTP_IP%:%FTP_PORT%/%FTP_INITIAL_DIRECTORY%"
    		set "EXITCODE=!ERRORLEVEL!"
    		if "!EXITCODE!" equ "0" (
    			Rem On logue les infos dans un fichier
    			call "%FUNCTIONS_FILE%" inLogFile "%FTP_SEND_LOG%" "[%date% %time:~0,2%h%time:~3,2%%time:~5,3%] - [Status: ENVOYE] - Le(s) fichier(s) "!FILES_TO_SEND!" a été envoyé "	
    		) else ( 
    			call "%FUNCTIONS_FILE%" inLogFile "%FTP_SEND_LOG%" "[%date% %time:~0,2%h%time:~3,2%%time:~5,3%] - [Status: ERROR(!EXITCODE!)] - Les fichiers "!FILES_TO_SEND!" n'a pas été envoyé "
    		)	
    )
     
     
    call "%FUNCTIONS_FILE%" inLogFile "%FTP_SEND_LOG%"
    pause
    goto :eof

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 87
    Par défaut
    Un petit up!

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur .NET en devenir
    Inscrit en
    Août 2017
    Messages
    549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET en devenir
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 549
    Par défaut
    Bonjour,

    Pour éviter que tu te sentes abandonné et surtout parce que ton script m'a beaucoup inspiré, je vais essayer d'apporter une réponse.

    1) à ta place je laisserais les temps par défaut, mais c'est totalement subjectif
    2) pour éviter d'avoir pleins de fichiers à contrôler, je mettrais tous les fichiers dans une archive (7zip par exemple), il n'y aura donc qu'un seul fichier à contrôler (voir mon script ci-dessous)
    3) la limite des 256 caractères ne peut être contournée, il faut réorganiser plus efficacement ton arborescence

    Concernant le point 2) tu peux prendre en exemple mon script qui utilise 7za (version console et standalone de 7Zip) pour créer un seul fichier (une archive sans aucune compression) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    @echo off
    chcp 28591 >nul
    Mode con cols=86 lines=37
    title %0 Script & Color 3A
     
    setlocal enableextensions enabledelayedexpansion
    
    set heure=!time:~0,2!!time:~3,2!!time:~6,2!
    set heure=!heure: =0!
    set timestamp=!date:~6,4!!date:~3,2!!date:~0,2!_!heure!
    
    REM Variable de connection FTP
    
    set "USER=login"
    set "PWD=password"
    set "IP=xxx.xxx.xxx.xxx"
    set "PORT=21"
    set "destination=/cURL"
    
    if "A%~1A"=="AA" (exit /b 1)
    cd /d %~dp1 && (call :ftpSendFiles "%destination%" %1)
    
    color 0f
    
    exit /b 0
    
    
    :ftpSendFiles
     
    rem  On met dans une variable OPTION toutes les options de curl
    set "OPTION=--retry-max-time 0 --retry-delay 5 --retry 10 --ftp-create-dirs --ftp-pasv --ftp-ssl-control --ssl-no-revoke --tlsv1.2 --ftp-method singlecwd"
    
    7za a -mx0 %timestamp%_archive.7z "%~2"
    echo. & echo. & echo.
    
    echo. & echo ==^>^> Documents à envoyer : %2
    echo. & echo ==^>^> Envoyés vers : ftp://%IP%%~1
    echo. & echo. & echo.
    echo Transfert en cours ...
    echo.
     
    curl %OPTION% -C - -k -# -u "%USER%:%PWD%" -T "%timestamp%_archive.7z" "ftp://%IP%:%PORT%%~1/"
    
    goto :eof

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [cURL] Dans quel contexte on utilise la bibliohèque curl ?
    Par nawelkw dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 05/03/2008, 17h08
  2. Utilisation avancée du TComboBox,TEdit
    Par remixtech dans le forum Composants VCL
    Réponses: 3
    Dernier message: 04/08/2007, 11h38
  3. Utilisation avancée de SCHTASKS
    Par noirot dans le forum Windows
    Réponses: 1
    Dernier message: 04/04/2007, 09h31
  4. utilisation avancée de tchart
    Par fofmata dans le forum Delphi
    Réponses: 2
    Dernier message: 31/03/2007, 09h13
  5. Utilisation avancée d'un champ numéroAuto
    Par mbzhackers dans le forum Access
    Réponses: 7
    Dernier message: 09/07/2006, 23h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo