2009-09-10 20 views
3

Je suis actuellement dans une situation où j'ai un accès très limité à un serveur, mais devez télécharger et télécharger une quantité importante de fichiers contenus dans une structure de répertoire unique. Je n'ai pas d'accès SSH, donc je ne peux pas utiliser SCP - et rsync n'est malheureusement pas une option. J'utilise actuellement ncftpput, ce qui est génial mais qui semble assez lent (malgré une connexion rapide).Récursivement PUT fichiers à un serveur distant en utilisant FTP

Existe-t-il une méthode alternative/meilleure que je pourrais examiner?

(S'il vous plaît accepter mes excuses si cela a été couvert, je fait une recherche rapide avant publication, mais n'a rien trouvé que spécifiquement répondu à ma question)

+2

pour ncftp - utilisez-vous Commande "put -R" pour faire un téléchargement de répertoire récursif? – DmitryK

+0

Je suis en effet - je pense qu'une partie du problème est FTP est assez archaïque .. donc il pourrait ne pas être une solution idéale – codeinthehole

Répondre

1

Je ne suis pas familier avec ncftpput. Pour le FTP non-interactif, j'ai toujours utilisé le module Perl Net :: FTP - http://perldoc.perl.org/Net/FTP.html

Ce sera plus rapide parce que vous pouvez vous connecter, puis faire tous les transferts à la fois (il semble d'un coup d'œil rapide que vous exécutez ncftpput une fois pour chaque fichier get/put). N'oubliez pas de ne JAMAIS utiliser les codes ASCII! Ceci est la valeur par défaut, utilisez donc:

$ftp->binary 

ASCII mangling doit mourir dans le même feu avec MySQL-fuseau horaire-interprétariat automatique.

2

Si vous avez une bonne connexion, je recommande de monter le serveur ftp via le gestionnaire de fichiers GNOME ou KDE, ou bien à l'aide CurlFtpFS. Ensuite, vous pouvez le traiter comme un autre dossier.

+0

Ce est une réponse horrible. Il n'y a aucun moyen que cela soit plus rapide que le FTP, et c'est beaucoup plus risqué, surtout avec de gros volumes de données, car il ne supporte pas la reprise à l'interruption. Et s'il n'a pas accès à SSH, comment va-t-il le configurer pour le montage? – Benubird

+0

Aucune configuration de serveur n'est requise. Le serveur est déjà configuré pour FTP. Et le but n'est pas de rendre les choses plus vite, c'est de les rendre plus faciles. Après le montage avec CurlFtpFS, une fois pourrait utiliser des utilitaires UNIX standard comme cp et rsync. J'ai dit que cela fonctionne mieux avec une bonne connexion. –

0

Depuis que je finis toujours par avoir un problème avec cela, je vais poster mes notes:

Une chose que je reçois toujours de confondre la syntaxe; donc ci-dessous il ya un script de testeur bash qui crée des répertoires temporaires, puis démarre un serveur ftp temporaire, et compare rsync (en mode fichier local, car il ne supporte pas ftp) avec lftp et ftpsync. La chose est - vous pouvez utiliser rsync /path/to/local /path/to/remote/, et rsync comprendra automatiquement, que vous voulez un sous-répertoire local créé sous remote; cependant, pour lftp ou ftpsync vous avez pour spécifier le répertoire cible manuellement, comme dans ... /path/to/local /path/to/remote/local (s'il n'existe pas, il sera créé).

Vous pouvez trouver le ftpserver-cli.py dans How do I temporarily run an FTP server? - Ask Ubuntu; et ftpsync est ici: FTPsync (cependant, notez qu'il est bogué, voir aussi Search/grep ftp remote filenames - Unix & Linux Stack Exchange);

Voici une sortie raccourcie du script puttest.sh, montrant le comportement de vente récursive dans différents cas:

$ bash puttest.sh 
Recreate directories; populate loctest, keep srvtest empty: 
show dirs: 
+ tree --noreport -a /tmp/srvtest /tmp/loctest 
/tmp/srvtest 
/tmp/loctest 
├── .git 
│   └── tempa2.txt 
└── tempa1.txt 

*NOTE, rsync can automatically figure out parent dir: 
+ rsync -a --exclude '*.git*' /tmp/loctest /tmp/srvtest/ 
show dirs: 
+ tree --noreport -a /tmp/srvtest /tmp/loctest 
/tmp/srvtest 
└── loctest 
    └── tempa1.txt 
/tmp/loctest 
├── .git 
│   └── tempa2.txt 
└── tempa1.txt 
cleanup: 
+ rm -rf /tmp/srvtest/loctest 

Start a temporary ftp server: 
+ sudo bash -c 'python /path/to/pyftpdlib/ftpserver-cli.py --username=user --password=12345 --directory=/tmp/srvtest &' 
+ sleep 1 
Using: user: user pass: 12345 port: 21 dir: /tmp/srvtest 
[I 14-03-02 23:24:01] >>> starting FTP server on 127.0.0.1:21, pid=21549 <<< 
[I 14-03-02 23:24:01] poller: <class 'pyftpdlib.ioloop.Epoll'> 
[I 14-03-02 23:24:01] masquerade (NAT) address: None 
[I 14-03-02 23:24:01] passive ports: None 
[I 14-03-02 23:24:01] use sendfile(2): False 
test with lftp: 

*NOTE, lftp syncs *contents* of local dir (rsync-like syntax doesn't create target dir): 
+ lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest/; exit' -u user,12345 127.0.0.1 
show dirs: 
+ tree --noreport -a /tmp/srvtest /tmp/loctest 
/tmp/srvtest 
└── tempa1.txt 
/tmp/loctest 
├── .git 
│   └── tempa2.txt 
└── tempa1.txt 
cleanup: 
+ rm -rf /tmp/srvtest/tempa1.txt 

*NOTE, specify lftp target dir explicitly (will be autocreated): 
+ lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest /loctest ; exit' -u user,12345 127.0.0.1 
show dirs: 
+ tree --noreport -a /tmp/srvtest /tmp/loctest 
/tmp/srvtest 
└── loctest 
    └── tempa1.txt 
/tmp/loctest 
├── .git 
│   └── tempa2.txt 
└── tempa1.txt 
cleanup: 
+ sudo rm -rf /tmp/srvtest/loctest 

*NOTE, ftpsync syncs *contents* of local dir (rsync-like syntax doesn't create target dir); also info mode -i is buggy (it puts, although it shouldn't): 

*NOTE, ftpsync --ignoremask is for older unused code; use --exclude instead (but it is buggy; need to change in source) 
+ /path/to/ftpsync/ftpsync -i -d '--exclude=.*\.git.*' /tmp/loctest ftp://user:[email protected]/ 
show dirs: 
+ tree --noreport -a /tmp/srvtest /tmp/loctest 
/tmp/srvtest 
└── tempa1.txt 
/tmp/loctest 
├── .git 
│   └── tempa2.txt 
└── tempa1.txt 
cleanup: 
+ sudo rm -rf /tmp/srvtest/tempa1.txt 

*NOTE, specify ftpsync target dir explicitly (will be autocreated): 
+ /path/to/ftpsync/ftpsync -i -d '--exclude=.*\.git.*' /tmp/loctest ftp://user:[email protected]/loctest 
show dirs: 
+ tree --noreport -a /tmp/srvtest /tmp/loctest 
/tmp/srvtest 
└── loctest 
    └── tempa1.txt 
/tmp/loctest 
├── .git 
│   └── tempa2.txt 
└── tempa1.txt 
cleanup: 
+ sudo rm -rf /tmp/srvtest/loctest 
+ sudo pkill -f ftpserver-cli.py 

Et, voici le script puttest.sh:

#!/usr/bin/env bash 
set -x 

# change these to match your installations: 
FTPSRVCLIPATH="/path/to/pyftpdlib" 
FTPSYNCPATH="/path/to/ftpsync" 

{ echo "Recreate directories; populate loctest, keep srvtest empty:"; } 2>/dev/null 

sudo rm -rf /tmp/srvtest /tmp/loctest 

mkdir /tmp/srvtest 

mkdir -p /tmp/loctest/.git 
echo aaa > /tmp/loctest/tempa1.txt 
echo aaa > /tmp/loctest/.git/tempa2.txt 

{ echo "show dirs:"; } 2>/dev/null 
tree --noreport -a /tmp/srvtest /tmp/loctest 

{ echo -e "\n*NOTE, rsync can automatically figure out parent dir:"; } 2>/dev/null 

rsync -a --exclude '*.git*' /tmp/loctest /tmp/srvtest/ 

{ echo "show dirs:"; } 2>/dev/null 
tree --noreport -a /tmp/srvtest /tmp/loctest 

{ echo "cleanup:"; } 2>/dev/null 
rm -rf /tmp/srvtest/* 

{ echo -e "\nStart a temporary ftp server:"; } 2>/dev/null 

# https://askubuntu.com/questions/17084/how-do-i-temporarily-run-an-ftp-server 

sudo bash -c "python $FTPSRVCLIPATH/ftpserver-cli.py --username=user --password=12345 --directory=/tmp/srvtest &" 
sleep 1 

{ echo "test with lftp:"; } 2>/dev/null 
# see http://russbrooks.com/2010/11/19/lftp-cheetsheet 
# The -R switch means "reverse mirror" which means "put" [upload]. 
{ echo -e "\n*NOTE, lftp syncs *contents* of local dir (rsync-like syntax doesn't create target dir):"; } 2>/dev/null 

lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest/; exit' -u user,12345 127.0.0.1 

{ echo "show dirs:"; } 2>/dev/null 
tree --noreport -a /tmp/srvtest /tmp/loctest 

{ echo "cleanup:"; } 2>/dev/null 
rm -rf /tmp/srvtest/* 

{ echo -e "\n*NOTE, specify lftp target dir explicitly (will be autocreated):"; } 2>/dev/null 

lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest /loctest ; exit' -u user,12345 127.0.0.1 

{ echo "show dirs:"; } 2>/dev/null 
tree --noreport -a /tmp/srvtest /tmp/loctest 

{ echo "cleanup:"; } 2>/dev/null 
sudo rm -rf /tmp/srvtest/* 

{ echo -e "\n*NOTE, ftpsync syncs *contents* of local dir (rsync-like syntax doesn't create target dir); also info mode -i is buggy (it puts, although it shouldn't):"; } 2>/dev/null 
{ echo -e "\n*NOTE, ftpsync --ignoremask is for older unused code; use --exclude instead (but it is buggy; need to change ` 'exclude=s' => \$opt::exclude,` in source)"; } 2>/dev/null 

$FTPSYNCPATH/ftpsync -i -d --exclude='.*\.git.*' /tmp/loctest ftp://user:[email protected]/ 

{ echo "show dirs:"; } 2>/dev/null 
tree --noreport -a /tmp/srvtest /tmp/loctest 

{ echo "cleanup:"; } 2>/dev/null 
sudo rm -rf /tmp/srvtest/* 

{ echo -e "\n*NOTE, specify ftpsync target dir explicitly (will be autocreated):"; } 2>/dev/null 

$FTPSYNCPATH/ftpsync -i -d --exclude='.*\.git.*' /tmp/loctest ftp://user:[email protected]/loctest 

{ echo "show dirs:"; } 2>/dev/null 
tree --noreport -a /tmp/srvtest /tmp/loctest 

{ echo "cleanup:"; } 2>/dev/null 
sudo rm -rf /tmp/srvtest/* 


sudo pkill -f ftpserver-cli.py 

{ set +x; } 2>/dev/null