J'utilise cURL pour essayer de télécharger tous les fichiers d'un certain répertoire.
voici à quoi ma liste de fichiers ressemble:
J'ai essayé de faire dans le script bash: iiumlabs.[].csv.pgp
et iiumlabs*
et je suppose que curl n'est pas très volumineux.
curl -u login:pass ftp.myftpsite.com/iiumlabs* -O
question: comment puis-je télécharger ce répertoire de fichiers en utilisant cURL?
OK, étant donné que vous utilisez Windows, le moyen le plus simple consiste à utiliser l'outil ftp
standard fourni avec celui-ci. Je base la solution suivante sur Windows XP, en espérant que cela fonctionnera aussi bien (ou avec des modifications mineures) sur d’autres versions.
Tout d’abord, vous devez créer un fichier de commandes (script) pour le programme ftp
, contenant les instructions correspondantes. Nommez-le comme vous voulez et mettez-le dedans:
curl -u login:pass ftp.myftpsite.com/iiumlabs* -O
open ftp.myftpsite.com
login
pass
mget *
quit
La première ligne ouvre une connexion au serveur FTP à ftp.myftpsite.com
. Les deux lignes suivantes spécifient le login et le mot de passe que ftp demandera (remplacez login
et pass
par seulement le login et le mot de passe, sans mot-clé). Ensuite, vous utilisez mget *
pour obtenir tous les fichiers. Au lieu du *
, vous pouvez utiliser n'importe quel caractère générique. Enfin, vous utilisez quit
pour fermer le programme ftp
sans invite interactive.
Si vous devez d'abord entrer un répertoire, ajoutez une commande cd
avant mget
. Cela devrait être assez simple.
Enfin, écrivez ce fichier et exécutez ftp
comme ceci:
ftp -i -s:yourscript
où -i
désactive l'interactivité (demander avant de télécharger des fichiers) et -s
spécifie le chemin d'accès au script que vous avez créé.
Malheureusement, le transfert de fichiers sur SSH n'est pas pris en charge de manière native dans Windows. Mais dans ce cas, vous voudrez probablement utiliser PuTTY tools de toute façon. Celui qui présente un intérêt particulier pour ce cas serait pscp
, qui est pratiquement le pendant PuTTY de la commande openssh scp
.
La syntaxe est similaire à la commande copy
et prend en charge les caractères génériques:
pscp -batch [email protected]:iiumlabs* .
Si vous vous authentifiez à l'aide d'un fichier de clé, vous devez le transmettre à l'aide de -i path-to-key-file
. Si vous utilisez un mot de passe, -pw pass
. Il peut également réutiliser des sessions enregistrées en utilisant PuTTY, en utilisant l'argument load -load your-session-name
.
Si vous n'êtes pas lié à curl, vous pouvez utiliser wget en mode récursif mais en le limitant à un niveau de récursivité, essayez ce qui suit:
wget --no-verbose --no-parent --recursive --level=1\
--no-directories --user=login --password=pass ftp://ftp.myftpsite.com/
--no-parent
: Ne montez jamais dans le répertoire parent lors de la récupération récursive.--level=depth
: spécifiez le niveau de profondeur maximum de la récursivité. La profondeur maximale par défaut est de cinq couches.--no-directories
: Ne créez pas de hiérarchie de répertoires lors de la récupération récursive.Qu'en est-il quelque chose comme ceci:
for /f %%f in ('curl -s -l -u user:pass ftp://ftp.myftpsite.com/') do curl -O -u user:pass ftp://ftp.myftpsite.com/%%f
Oh, j'ai juste ce dont tu as besoin!
$Host = "ftp://example.com/dir/";
$savePath = "downloadedFiles";
if($check = isFtpUp($Host)){
echo $ip." -is alive<br />";
$check = trim($check);
$files = explode("\n",$check);
foreach($files as $n=>$file){
$file = trim($file);
if($file !== "." || $file !== ".."){
if(!saveFtpFile($file, $Host.$file, $savePath)){
// downloading failed. possible reason: $file is a folder name.
// echo "Error downloading file.<br />";
}else{
echo "File: ".$file." - saved!<br />";
}
}else{
// do nothing
}
}
}else{
echo $ip." - is down.<br />";
}
et les fonctions isFtpUp
et saveFtpFile
sont les suivantes:
function isFtpUp($Host){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $Host);
curl_setopt($ch, CURLOPT_USERPWD, "anonymous:[email protected]");
curl_setopt($ch, CURLOPT_FTPLISTONLY, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$result = curl_exec($ch);
return $result;
}
function saveFtpFile( $targetFile = null, $sourceFile = null, $savePath){
// function settings
set_time_limit(60);
$timeout = 60;
$ftpuser = "anonymous";
$ftppassword = "[email protected]";
$savePath = "downloadedFiles"; // should exist!
$curl = curl_init();
$file = @fopen ($savePath.'/'.$targetFile, 'w');
if(!$file){
return false;
}
curl_setopt($curl, CURLOPT_URL, $sourceFile);
curl_setopt($curl, CURLOPT_USERPWD, $ftpuser.':'.$ftppassword);
// curl settings
// curl_setopt($curl, CURLOPT_FAILONERROR, 1);
// curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_FILE, $file);
$result = curl_exec($curl);
if(!$result){
return false;
}
curl_close($curl);
fclose($file);
return $result;
}
MODIFIER:
c'est un script php . enregistrez-le sous un fichier .php, mettez-le sur votre serveur web, remplacez $ ip par l'adresse (ne doit pas être ip) du serveur ftp à partir duquel vous souhaitez télécharger des fichiers, créez un répertoire nommé même répertoire que ce fichier.
Voici comment j'ai fait pour télécharger rapidement avec cURL (je ne sais pas combien de fichiers il peut télécharger):
setlocal EnableDelayedExpansion
cd where\to\download
set STR=
for /f "skip=2 delims=" %%F in ('P:\curl -l -u user:password ftp://ftp.example.com/directory/anotherone/') do set STR=-O "ftp://ftp.example.com/directory/anotherone/%%F" !STR!
path\to\curl.exe -v -u user:password !STR!
Pourquoi skip = 2 ? Pour piloter .
et ..
Pourquoi delims = ? Prendre en charge les noms avec des espaces
Vous pouvez utiliser un script comme ceci pour mac:
for f in $(curl -s -l -u user:pass ftp://your_ftp_server_ip/folder/)
do curl -O -u user:pass ftp://your_ftp_server_ip/folder/$f
done