curl --ftp-ssl para pegar todos os arquivos no diretório remoto

4

É possível obter todos os arquivos em um diretório usando curl? Aqui está minha string até agora:

curl --ftp-ssl -k ftp://user:pass@IP

Isto irá listar os arquivos no diretório FTP do usuário, como ajustar esta string para obter (RETR) todos os arquivos no diretório remoto?

    
por orbitron 02.11.2011 / 00:12

3 respostas

4

AFAIK, não existe essa opção para baixar um diretório com curl , então você deve primeiro obter a listagem e enviá-la para curl para baixar arquivo por arquivo, algo assim:

$ curl -s ftp://user:pass@IP/path/to/folder/ | \
    grep -e '^-' | awk '{ print $9 }' | \
        while read f; do \
            curl -O ftp://user:pass@IP/path/to/folder/$f; \
        done
    
por 02.11.2011 / 09:04
2

Você também pode fazer o paralelismo do processo via xargs :

curl -s "ftp://user:pass@IP/path/to/folder/" \
    | grep -e '^-' \
    | awk '{ print $9 }' \
    | xargs -I {} -P ${#procs} curl -O "ftp://user:pass@IP/path/to/folder/{}"
    
por 06.07.2017 / 10:23
0

Aqui está um script mais reutilizável que realiza a solução curl | pipe | while do quanta:

#!/bin/bash
#
# Use cURL to download the files in a given FTPS directory (FTP over SSL)
# eg:
# curl_get_ftp_dir -u myUserName -p myPassword -d ftps://ftpserver.com/dir1/dir2
# Optionally, use:
#    -k - to ignore bad SSL certificates
#    --config userPassFile - to use the contents of a file including myUserName:myPassword in place of command line arguments
#    --silent - to silently download (otherwise cURL will display stats per file)

while [[ $# -gt 1 ]]
do
key="$1"

case $key in
    -u|--username)
    user="$2"
    shift 
    ;;
    -p|--password)
    pass="$2"
    shift 
    ;;
    -d|--dir|--directory)
    ftpDir="$2"
    shift 
    ;;
    -k|--ignoreSSL|--ignoreBadSSLCertificate)
    ignoreBadSSLCertificate="-k"
    ;;
    -s|--silent)
    silent="-s"
    ;;
    -K|--config|--configFile)
    config="$2"
    shift 
    ;;
    *)
        echo "Unknown Option!"
    ;;
esac
shift 
done

if [ -z "${config+x}" ]; then 
    CURL_OPTS="$silent --ftp-ssl $ignoreBadSSLCertificate -u $user:$pass"
else
    #CURL_OPTS="$silent --ftp-ssl $ignoreBadSSLCertificate --config $config"
    #Originally intended to be a curl config file - for simplicity, now just a file with username:password in it
    #Be sure to chmod this file to either 700, 400, or 500
    CURL_OPTS="$silent --ftp-ssl $ignoreBadSSLCertificate -u $(cat $config)"
fi

curl $CURL_OPTS $ftpDir | \
grep -e '^-' | awk '{ print $9 }' | \
    while read f; do \
        curl -O $CURL_OPTS $ftpDir/$f; \
    done
    
por 09.08.2016 / 19:35

Tags