it-swarm.com.ru

загрузка всех файлов в каталоге с помощью cURL

Я использую cURL, чтобы попытаться загрузить все файлы в определенном каталоге.

вот как выглядит мой список файлов:

enter image description here

Я пытался сделать в сценарии bash: iiumlabs.[].csv.pgp и iiumlabs*, и я думаю, что curl не большой на подстановочных знаках.

curl -u login:pass ftp.myftpsite.com/iiumlabs* -O

вопрос: Как я могу скачать этот каталог файлов с помощью cURL?

10

ОК, учитывая, что вы используете Windows, самый простой способ сделать это - использовать стандартный инструмент ftp, входящий в комплект поставки. Я основываю следующее решение на Windows XP, надеясь, что оно будет работать (или с небольшими изменениями) на других версиях.

Прежде всего, вам нужно создать пакетный файл (скрипт) для программы ftp, содержащий инструкции для него. Назовите его так, как хотите, и вставьте в него:

curl -u login:pass ftp.myftpsite.com/iiumlabs* -O

open ftp.myftpsite.com
login
pass
mget *
quit

Первая строка открывает соединение с FTP-сервером по адресу ftp.myftpsite.com. В двух следующих строках указывается логин и пароль, который будет запрашивать ftp (замените login и pass только логином и паролем без каких-либо ключевых слов). Затем вы используете mget *, чтобы получить все файлы. Вместо * вы можете использовать любой подстановочный знак. Наконец, вы используете quit, чтобы закрыть программу ftp без интерактивной подсказки.

Если вам нужно было сначала ввести какой-либо каталог, добавьте команду cd перед mget. Это должно быть довольно просто.

Наконец, напишите этот файл и запустите ftp так:

ftp -i -s:yourscript

где -i отключает интерактивность (запрашивает перед загрузкой файлов), а -s указывает путь к созданному вами сценарию.


К сожалению, передача файлов по SSH изначально не поддерживается в Windows. Но в этом случае вы, возможно, захотите использовать PuTTY tools в любом случае. В этом случае особый интерес представляет pscp, который практически является аналогом команды PuTTY команды openssh scp.

Синтаксис похож на команду copy и поддерживает символы подстановки:

pscp -batch [email protected]:iiumlabs* .

Если вы аутентифицируетесь, используя файл ключа, вы должны передать его, используя -i path-to-key-file. Если вы используете пароль, -pw pass. Он также может повторно использовать сеансы, сохраненные с помощью PuTTY, используя аргумент load -load your-session-name.

9
Michał Górny

Если вы не связаны с curl, вы можете использовать wget в рекурсивном режиме, но ограничив его одним уровнем рекурсии, попробуйте следующее;

wget --no-verbose --no-parent --recursive --level=1\
--no-directories --user=login --password=pass ftp://ftp.myftpsite.com/
  • --no-parent: никогда не подниматься в родительский каталог при рекурсивном извлечении.
  • --level=depth: укажите максимальную глубину уровня рекурсии. Максимальная глубина по умолчанию составляет пять слоев.
  • --no-directories: не создавать иерархию каталогов при рекурсивном извлечении.
32
kkeller

Как насчет чего-то вроде этого:

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
2
Robi

О, у меня есть только то, что вам нужно!

$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 />";
}

и функции isFtpUp и saveFtpFile следующие:

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;
}

Правка:

это скрипт php . сохраните его как файл .php, поместите его на свой веб-сервер, измените $ ip на адрес (не обязательно должен быть ip) сервера ftp, с которого вы хотите загружать файлы, создайте каталог с именем downloadFiles на тот же каталог, что и этот файл.

1
Prasanth

Вот как я это сделал для быстрой загрузки с помощью cURL (хотя я не уверен, сколько файлов он может загрузить):

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!

Почему пропустить = 2 ? Чтобы получить . и ..

Почему delims = ? Для поддержки имен с пробелами

1
kiwixz

Вы можете использовать скрипт для 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
0
M.Selman SEZGİN