Création
d'entreprise
Posez votre question Signaler

Script unix pour un FTP recursif ? [Fermé]

ido daisuke - Dernière réponse le 6 sept. 2004 à 14:50
j'ai besoin de transferer via FTP tout le contenu d'un repertoire
pour ce faire, je n'ai accès comme client ftp qu'à la commande ftp du shell unix.

Est-il possible de faire un script permettant d'envoyer tout le contenu d'un repertoire (dossiers et fichiers), a partir du nom de ce repertoire, via la commande ftp ?
Lire la suite 

Script unix pour un FTP recursif »

38 réponses
Réponse
+6
moins plus
j'ai déjà écrit des scripts en shell qui permettent de faire des transferts par ftp de répertoire et sous-répertoire en mode récursif
avec une connexion sécurisée user et mot de passe écrite dans le script.
on peut ainsi faire une sauvegarde automatique de répertoires de plusieurs PC à partir d'une machine unix.

Dasky - 15 déc. 2003 à 22:52
Salut, j'utilise LFTP, et je rencontre aussi le problème d'envoi de contenu de répertoire récurisivement... Je suis sous Mandrake 9.1, mode graphique KDE...
Merci de m'envoyer le script... ça me ferait énormément plaisir.
---- > Adresse supprimée Modération CCM
Ciao.
Dasky
Eric - 6 janv. 2004 à 18:07
Ce script m'interesse également car je dois transférer des fichiers PDF dès leur apparition dans un dossier d'un serveur SUN ver un serveur NT.

Merci pour ta réponse.

Eric
Cornez - 16 avril 2004 à 11:04
je suis également interréssé par le scrip permettant d'effectuer un ftp automatique.
Je dois en effet effectuer un transfert de répertoires d'un serveur unix vers un autre serveur unix.
D'avance je vous remercie pour votre réponse
Réponse
+3
moins plus
OK OK ... lol ! desolé pour le coup de bourre gt vener ce jour la puisque g cherché le moyen de faire des ftp en fonction du user et du password qui seraient ds des variables et ke je ne trouvais pas la syntaxe... c chose fait et tu me dit que g repondu sommairement ... ok ct de la recuperation et pas de l'envoi, mais je t'assure que by marche aussi bien que bye !!!

enfin voici un script de recuperation de fichiers distants en fonction d'un user et password qu'on peu declarer en variable:

avec comme variables (entre [] = pas obligé)

liste=/.../fichier_liste_des_machines.txt (liste séparée par des espaces ou des retours chariot)
REPLOCAL=/.../repertoirelocal
SOUSREP1=sousrepertoire1
SOUSREP2=...
...
[LOG=/.../fichierlog.log]
USER=user
PASSWORD=password

# DEBUT ################
for MACHINE in $liste
do

ftp -inv $MACHINE <<FINDETEXTE [>$LOG]
user $USER $PASSWORD
lcd $REPLOCAL
cd $REPDISTANT
mget *
lcd $REPLOCAL/$SOUSREP1
cd $REPDISTANT/$SOUSREP1
mget *
...
lcd $REPLOCAL/$SOUSREPn
cd $REPDISTANT/$SOUSREPn
mget *
bye
FINDETEXTE

done
####################

etc... ce n'est qu'un exemple, si vous avez des sous sous sous repertoires ca marche pareil, même principe... mais il y a mieux si vous avez beaucoup de sous repertoires : il faut faire une fonction "FTP_mget" par exemple, avec les user, pass, reps en parametres et faire la boucle en fonction des repertoires, et a chaque fois appeler la fonction FTP_mget, ca sera plus simple a gerer...
mais est ce plus rapide ? j'en doute, car la procédure d'authentification prend du temps, et repetée beaucoup cela pourait faire baisser les perf grave...

enfin voila o cas ou une fonction comme decrit ci dessus, qu'on appelerai avec des parametres dans l'ordre des declaration de variables interne, mais c pas obligé, on peut se contenter de declarer juste la machine et les repertoires si le user et le pass sont communs et declarés avant, a adapter !

FTP_mget ()
{
MACHINE=$1
USER=$2
PASSWORD=$3
REPLOCAL=$4
REPDISTANT=$5
ftp -inv $MACHINE <<FINDETEXTE
user $USER $PASSWORD
lcd $REPLOCAL
cd $REPDISTANT
mget *
bye
FINDETEXTE
}

explications sur les parametres du programme ftp:
-i == mode interactif OFF == pas de question "telecharger ce fichier (O/N) ?" en cas de mget ou mput
-n == n'utilise pas le .netrc
-v == verbose, dans la log du ftp si vous l'utilisez il y aura des lignes commencant par un numero a 3 chiffres, comme des codes retours, ca vous permet par la suite de detecter des erreurs ds vos transferts, avec des grep dans le fichier de log, après chaque appel de la fonction FTP_mget par exemple...

Réponse
+2
moins plus
Moi j'utilise dftp ou un truc du genre, j'essaierai de penser a regarder ca ce soir a moins que je retrouve ca sur le net... C'est pratique tu peux faire une copie de ce que tu as dans un repertoire...

.  .
\_/
Réponse
+2
moins plus
http://lftp.yar.ru/lftp-man.html

Hop, en fait ca s'appelle lftp, je ne sais pas il est peut etre installe ...
Sinon ben ca doit etre faisable de faire le script en ftp pur mais relativement fastidieux quand meme j'en ai peur :-S

.  .
\_/
Réponse
+2
moins plus
Salut tous ,

Je veux le script ftp sous linux.
ou idèe comment le programmer les fonctions nècessairre .
C t'un projet qu'il me faux rendre d'ici une semaine .
C urgent !!!

Merci pour tout aides qui me sera apportè .

Réponse
+2
moins plus
Salut !

Alors justement, je faisais un petit tour sur ce post cherchant désespéremment une réponse à mon prblème de la meme acabie et oh rage, oh désespoir quand j'arrive à la fin et remarque qu'il n'y à que partiellement la réponse ... :-( Vraiment dommage.

Alors si quelqu'un par hasard, à le code et veut bien le faire partager aux autres ca me serait bien utile. Ma requête se tourne en premier vers l'auteur du code en question. ;-)

Merci d'avance. Elise78 :-p

PS : mon adresse mail au cas ou : mannon78_At_hotmail.com

scavengerElise78 - 17 août 2004 à 14:31
en attendant armez vous de courage, ce n'est pas si compliqué !

==> déjà la commande rsh pour recuperer l'arbo distante :

rsh machine -l login find /arbo_base_distante -type d >>/tmp/fichier_local.txt

vous récupere toute l'arbo distante depuis le rep /arbo_base_distante dans le fichier local /tmp/fichier_local.txt

ceci ne fonctionne que si vous avez declaré le login et son pass dans le .netrc du user que vous utilisez pour lancer le rsh, modulo le fait que la machine distante accepte vos connections... (voir le /etc/hosts.equiv) mais ca c'est une autre histoire...

amusez vous bien !!!!

scav'
Elise78- 18 août 2004 à 14:11
Bon bein scavenger, je ne voudrais pas enttacher ton orgueil mais tu ne reponds pas du tout a ma question. Elle est ou ta connexion telnet ou equivalente par script ???

Bon en attendant j'en profite pour donner mon code (aussi clair et détaillé que possible, pour ceux qui ne s'y connaissent pas).

#!/bin/bash

#!---------------------------------------------------------------------!
#! recup_rep_ftp                   Historiques des interventions       !
#!---------------------------------------------------------------------!
#!   Date   !       Auteur      ! Version !            Libelle         !
#!---------------------------------------------------------------------!
#! 30/07/04 ! Elise78 sur le    ! 1.0     ! Creation                   !
#!          ! forum CCM         !         !                            !
#!---------------------------------------------------------------------!
#!                                                                     !
#!---------------------------------------------------------------------!
 

#----------------------------------------------------------------------#
# 
# Script permettant de copier un repertoire complet (une arborescence),
# sur un serveur distant, par connexion ftp
# 
# Au prealable :
#   
#    - Creation du fichier arbo_nomserveurdist.txt, qui contient 
#	l'arborescence complete a creer et a recuperer sur le 
#	client, par une connexion telnet
#    - Creation du repertoire cible sur le client, soit avec les droit  
#	du proprietaire final, soit avec un quelconque utilisateur 
#	en n'omettant pas de donner ce repertoire a l'utilisateur  final
#    - Executer ce script en ayant les droits root
# 
#
# Utilisation de la commande (chemin ajoute dans le PATH) :
#  
# recup_rep_ftp <serveur> <login> <passwd> <deb_arbo_serveur> <deb_arbo_client>
#     $0	         $1	  $2	 $3	     $4			$5		
# 
# 	<nom_fic_arbo> <proprio>  <groupe>  <type_trans>
#	        $6	$7	 $8	    $9
#
# $0 recuparbo : nom de la commande shell ( programme )
# $1 serveur : le serveur sur lequel on veut recuperer une partie de 
#	l'arborescence
# $2 login et $3 passwd : pour la connexion ftp au serveur
# $4 deb_arbo_serveur : le point a partir duquel on veut l'arborescence 
#	du cote serveur
# $5 deb_arbo_client : le noeud a partir duquel on veut copier, du cote 
#	client, l'arborescence recuperee sur le serveur
# $6 nom_fic_arbo : nom de fichier de l'arborescence du serveur a recuperer
# $7 proprio : ce sera le proprietaire du repertoire une fois copie sur 
#	le poste cible
# $8 groupe : le groupe du proprietaire des fichiers sur l'ordinateur cible
# $9 type_trans : option du type de transfert de fichiers : binary ou ascii
#
# 
# Ameliorations a prevoir :
#   
#    - Creation d'un fichier de suppression de l'arborescence en cas d'erreur
#    - Ajouter l'option type de transfert : binaire ou ascii (suivant le type 
#    	de telechargement)
#    - Ajouter la fonctionalite de choisir le proprietaire final du repertoire
#	copie sur le client et de son groupe
#    - Voir si le fait de faire un mget en ftp fait la meme chose qu'un 
#	rcp -rp *   ou un     rcp -p .*
#    - Mettre sous la forme -l login -p passwd -v verbose ... un truc dans 
# 	ce style
#    - Faire en sorte que les actions au prealable ne soient pas obligatoires :
# 	elles devront etre réalisées par le script. 
# 
#
# Auteur : U.I.M    Alias Elise78 sur le Forum CCM 
#
#----------------------------------------------------------------------#
 
 
# Verification de l'existance des parametres

# S'il n'y a aucun parametre pour le fonction
if [ $# = 0 ] 
then
	echo -n " Aucun argument en parametre !! "
	echo  " Veuillez utiliser cette norme : "
	echo  " \$> recuparbo <serveur> <login> <passwd> <deb_arbo_serveur> 
	<deb_arbo_client> <nom_fic_arbo> <proprio>  <groupe>"
	echo 
	exit -1
fi

# Mettre tous les parametres dans des variables parce qu'un set efface tout
nom_script=$0
serveur=$1
login=$2
passwd=$3 
deb_arbo_serveur=$4
deb_arbo_client=$5 
nom_fic_arbo=$6
proprio=$7
groupe=$8

# S'il y a les parametres on continue
# il faut etre sous le compte root
echo -e "\n Avant d'executer ce script, il faut avoir creer le "
echo -e "\n    fichier de l'arborescence du serveur "
echo -e "\n    et il faut etre root \n"
xhost +

# Deplace au bon endroit pour copier le fichier et executer 
# la copie de l'arborescence du serveur
cd $deb_arbo_client

# Recuperation du fichier de l'arborescence cree sur le serveur
echo -e "\n ***** Recuperation du fichier de l'arborescence *****"
echo -e "\n ****   ***  **** cree sur le serveur ****   ***   ***"
ftp -v -i -n << FIN
open $serveur
user $login $passwd
ascii
cd $deb_arbo_serveur
mget $nom_fic_arbo
bye
FIN

# Pour que le user final puisse le lire et le modifier : 
# root donne les droits
chmod 766 $nom_fic_arbo
# Pas utile car je le manip en root : chown $proprio:$group $nom_fic_arbo

# Suppression de la premiere ligne du fichier $6=$nom_fic_arbo et 
#    redirige vers fichier recuparbo_ftp
sed 's/^././w recuparbo_ftp' $nom_fic_arbo

# Mettre en debut de fichier la chaine 'mkdir '
sed 's/\.\//mkdir \.\//w creerarbo' recuparbo_ftp

# Mettre en debut de fichier la chaine 'rmdir '
sed 's/\.\//rmdir \.\//w deletearbo' recuparbo_ftp
# !!!! Il faut inverser le contenu du fichier pour eviter de l'executer 
# autant de fois qu'il y a de noeuds de repertoire

# Le rendre executable
chmod 755 creerarbo
chmod 755 deletearbo

# je le donne a $proprio pour qu'il puisse l'executer sans probleme
chown pegase:users creerarbo.txt
# je me connecte sous $proprio pour que l'arbo lui appartienne 
# Creation de l'arborescence cote client
# Recuperation de maniere recursive par ftp des fichiers sur le serveur

su - $proprio << END
echo -e "\n -------- Connexion proprio !! ---------\n"
cd $deb_arbo_client
export PATH=$PATH:/$deb_arbo_client
creerarbo
find . -type d -exec echo {} \; > a.txt 
sed 's/\.\///g' a.txt > recup_recursif_ftp.txt
rm -f a.txt  #  recup_arbo_ftp_recursif.txt
echo -e "-------- Fin connexion proprio !! ---------\n"
exit
END


echo -e "\n  -------- Debut telechargement des fichiers --------- \n"
cd $deb_arbo_client
echo -e " pwd : "`pwd`" "
echo -e " serveur : cd $deb_arbo_serveur"
echo -e " client :  cd $deb_arbo_client"

echo -e "\n ftp -v -i -n << FIN"
echo -e " open $serveur"
echo -e " user $login $passwd"
echo -e " cd $deb_arbo_serveur"
echo -e " bye"
echo -e " FIN \n"


# On copie le contenue d'un repertoire et on change le proprietaire	
for j in `cat recup_recursif_ftp.txt`  
do
	echo -e "\n\n    ** Repertoire serveur : [$deb_arbo_serveur/$j]"
	cd $deb_arbo_client/$j
	echo "    **** Repertoire client : ["`pwd`"]"
ftp -v -i -n << FIN 
open $serveur
user $login $passwd
cd $deb_arbo_serveur/$j
mget *
! pwd
! chown pegase:users *
bye
FIN
done 

cd $deb_arbo_client
ls -la --color=always $deb_arbo_client
	
echo -e "\n --- Fin du script de recuperation du repertoire complet ----"
echo -e "\n"


Et ca marche nikel ....
Personnellement ma solution ne me convient a moi-meme que partiellement parce que je ne recupere pas les fichers commencant pas un '.' exemple .env_oracle !! et pour cela faut faire un rcp -rp .* mais sous une connexion telnet d'ou mon besoin de me connecter a distance avec telnet !!

Cordialement, Melle Elise78
Elise78- 18 août 2004 à 14:24
Ah et les remarques et conseils sont les bien venus !! ;-)

Cordialement, Melle ELise78.
Réponse
+1
moins plus
oui ce genre de script existe.
J'en ai vu en perl, en Python...
batmat- 24 juin 2003 à 18:50
oui certainement dans ces langages, c'est vrai.
Moi, je pensais au shell "classique" (*sh). Il me semble que ce n'est pas possible avec celui-ci

@++
Poster, poster encore et toujours :-)
Réponse
+1
moins plus
Désirant à partir d'un PC Linux rapatrié régulièrement via FTP une des fichiers d'un autre PC, j'aimerais bien, dans la mesure du possible, avoir ton script.
Merci d'avance.
Adresse supprimée Modération CCM

Réponse
+1
moins plus
J'aimerais bien aussi l'avoir
si ca te gene pas
mon mail c Adresse supprimée Modération CCM
Merci

Réponse
+1
moins plus
la modestie ne t'étouffe pas, mais si tu lisais bien les demandes tu n'y réponds que très sommairement

en premier ton script ne focntionnera pas avec "by" au lieu de "Bye" c'est un détail !!
par contre entièrement d'accord sur l'astuce

et puis c'est plutot "binary" et "mget" pour récupérer des fichiers

il n'est pas récursif
ton astuce de déclarer dans .netrc fait que ton script ne fonctionne qu'à partir d'un client connu.

pour ceux qui sont intéressé je peux leur envoyer un script complet
utilisé par un serveur unix qui sauvegardait toutes les nuits des répertoires complet de 30 à 50 PC (il faut installé un serveur ftp sur le poste ex logiciel war-ftpd)
voir mon premier message

Réponse
+1
moins plus
laisse moi ton email et je t'envoie mon script avec une fonction récursive, (le programme gère tout seul la profondeur d'un répertoire) testé et utilisé entre un serveur unix et des PC sur un réseau WAN ayant un service ftp installlé (logiciel warftpd)

Rakotoson - 16 août 2004 à 13:36
Je veux recevoir le script unix pour ftp recursif
remerciements
Réponse
+1
moins plus
Mon e-mail : Adresse supprimée Modération CCM
Merci aubertin pour votre aide .

Réponse
+1
moins plus
Merci aubertin ,
j'essayerai de comprendre ton script,
il me parait tres difficile.

Réponse
+1
moins plus
ben c sympa.... d'en faire profiter les autres... ca me donbne envie d'effacer mon post tiens :)

Réponse
+1
moins plus
ce script m'intéresse.
c'est possible de l'avoir??
Adresse supprimée Modération CCM

Réponse
+1
moins plus
bonjour SAM,

mais que veux tu en fait ? perso g mis les infos qu'il fallait pour le script en question, et sinon aubertin a fait un autre script apparemment plus compliqué, donc je vois pas trop ... ca ne te suffit pas ce que j'ai mis ??? demande a aubertin si c pas suffisant ou réexplique toi :)

cdlt,
scavenger

Réponse
+1
moins plus
En effet, pourquoi ne pas mettre en ligne ce script ?
C'est pas du GNU/GPL ???
Mdr

Réponse
+1
moins plus
bonjour, je serai interresé par le script ftp récursif sous linux.
serait il possible de me l'envoyer à cette adresse Adresse supprimée Modération CCM
merci d'avance

Réponse
-1
moins plus
Je crois que cette question a malheureusement déjà été posée... :
On ne peut pas car ftp ne prend pas le mot de passe en option...

@++
Poster, poster encore et toujours :-)

Réponse
-1
moins plus
pfff trop facile:

ftp -v machine <<FINLE
prompt
[type ascii]
[lcd repertoirelocal]
cd repertoiredistant
mput *
by
FINLE

et voila !!!!!!!!!!!!!!!!!!!!!
c tout naze, et ca suppose que le user qui envoi les fichiers est déclaré dans le .netrc de son répertoire home sinon on vous demandera un mot de passe et un user

==> ligne à rajouter dans le .netrc pour cofigurer un pass et un login automatique en rlogin ou en ftp:
machine xxxxx login yyyy password zzzzz

Ce document intitulé « Script unix pour un FTP recursif ? » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?