Script unix pour un FTP recursif ?

[Fermé]
Signaler
-
 raphael -
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 ?

20 réponses

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.
4
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

>
Messages postés
1
Date d'inscription
mercredi 5 novembre 2003
Statut
Membre
Dernière intervention
5 novembre 2003

hello,
Si c'est possible j'aimerais bien aussi l'avoir ce script...
Adresse supprimée Modération CCM
merci
Salut,
Désirant à partir d'un PC Linux rapatrié régulièrement via FTP une arborescence d'un autre PC, j'aimerais bien, dans la mesure du possible, avoir ton script.
Merci d'avance.
Adresse supprimée Modération CCM
Bernard
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
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
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
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...
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 783
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...

.  .
\_/
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 783
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

.  .
\_/
Messages postés
9
Date d'inscription
samedi 8 mai 2004
Statut
Membre
Dernière intervention
12 mai 2004

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è .
Messages postés
77
Date d'inscription
mardi 18 mai 2004
Statut
Membre
Dernière intervention
16 novembre 2006
3
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
Messages postés
77
Date d'inscription
mardi 18 mai 2004
Statut
Membre
Dernière intervention
16 novembre 2006
3 >
Messages postés
77
Date d'inscription
mardi 18 mai 2004
Statut
Membre
Dernière intervention
16 novembre 2006

Salut ScavengeR !!

Il me semble que tu as tout compris.

Le truc c'est que je suis hyper feignante et que je n'aime pas faire ne serait-ce 10 fois la même manip fastidieuse (et surtout j'ai peur d'oublier quelque chose). Et c'est dans ces moments la ou je me sens bien avec l'informatique lol

Je voudrais que ce script marche pour le plus le cas possible sans pour autant faire un applicatif graphique  … par exemple je récupère ce script et j'arrive a le faire tourner sur mon poste personnel …

Effectivement je cherche un truc du style :

telnet $machine <<EOF
commandes...
EOF

ou

par une commande que je peux lancer par ftp
parce que je ne peux pas créer mon fichier
arbo_serveurdist.txt par le ftp (avec la commande
find . –type d echo{} \; >> arbo_serveurdist.txt

Je m'amuse comme une folle lol !!!
>
Messages postés
77
Date d'inscription
mardi 18 mai 2004
Statut
Membre
Dernière intervention
16 novembre 2006

BON OKOK ... je vais vous le donner, moi, ce script...
bah c pas compliqué, il faut simplement utiliser les commandes de base que vous avez semble t il tous appris (sic!) mais que votre poil dans la main vous empêche de taper... LOL !!! n'est ce pas Elise...
(surtout le prenez pas mal ct un compliment)

alors pour l'arbo distante il y a 2 solutions :
==>soit vous connaissez votre arbo distante et l'avez dans un fichier plat sous la forme :

(...)
/fs01/appl/PRO/controlm
/fs01/appl/PRO/controlm/install
/fs01/appl/PRO/controlm/ctm
/fs01/appl/PRO/controlm/ctm/exe_AIX
(...)

, soit il faut le fabriquer.
==>pour récuperer une arbo distante, il n'y a pas 36 solutions, en fait il n'y en a qu'une seule : le rsh !

...oo00 voici donc, sous vos yeux ébahis... le script magique !!! 00oo...

#!/bin/ksh
#@(#)################
#@(#)# cartouche gnagnagna #
#@(#)################

#-----------------------------------------------------------
#Definition variables environnement
#-----------------------------------------------------------

NbParam=$#
MachDistante=$1
RepDistant=$2
RepLocal=$3

DATE=$(date +%y/%m/%d' '%T)
echo -------------------------------------------------------
echo $DATE $0
echo -------------------------------------------------------

#-----------------------------------------------------------
# Preparation des variables programmes
#-----------------------------------------------------------

umask 000
REP_APPLI="/tmp"
F_LOG="${REP_APPLI}/log/$(basename $0)_$(date +%Y%m%d).log"
FTP_LOG="${REP_APPLI}/log/FTP_RECUP_PAYS_$(date +%Y%m%d).log"
rm ${FTP_LOG}

FTP_LIST="/tmp/ListeFichiers_RepDistant.txt"
rm ${FTP_LIST}

(...)
(...)

hum en fait je ne veux pas vous le donner pour l'instant car vous devez chercher encore un peu... d'abord ce serait macher votre travail, et puis vous etes payés pour ca, non ?
faites des propositions et je lacherai un peu de code de ci de là en ca
>
Messages postés
77
Date d'inscription
mardi 18 mai 2004
Statut
Membre
Dernière intervention
16 novembre 2006

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'
Messages postés
77
Date d'inscription
mardi 18 mai 2004
Statut
Membre
Dernière intervention
16 novembre 2006
3
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
Messages postés
77
Date d'inscription
mardi 18 mai 2004
Statut
Membre
Dernière intervention
16 novembre 2006
3
Ah et les remarques et conseils sont les bien venus !! ;-)

Cordialement, Melle ELise78.
Messages postés
32844
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 601
oui ce genre de script existe.
J'en ai vu en perl, en Python...
Messages postés
1871
Date d'inscription
jeudi 1 novembre 2001
Statut
Membre
Dernière intervention
9 janvier 2008
114
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 :-)
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
J'aimerais bien aussi l'avoir
si ca te gene pas
mon mail c Adresse supprimée Modération CCM
Merci
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
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)
Je veux recevoir le script unix pour ftp recursif
remerciements
Messages postés
9
Date d'inscription
samedi 8 mai 2004
Statut
Membre
Dernière intervention
12 mai 2004

Mon e-mail : Adresse supprimée Modération CCM
Merci aubertin pour votre aide .
Messages postés
9
Date d'inscription
samedi 8 mai 2004
Statut
Membre
Dernière intervention
12 mai 2004

Merci aubertin ,
j'essayerai de comprendre ton script,
il me parait tres difficile.
ben c sympa.... d'en faire profiter les autres... ca me donbne envie d'effacer mon post tiens :)
ce script m'intéresse.
c'est possible de l'avoir??
Adresse supprimée Modération CCM
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
En effet, pourquoi ne pas mettre en ligne ce script ?
C'est pas du GNU/GPL ???
Mdr
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
Messages postés
1871
Date d'inscription
jeudi 1 novembre 2001
Statut
Membre
Dernière intervention
9 janvier 2008
114
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 :-)
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