Dalaran Posté(e) le 11 mars 2011 Partager Posté(e) le 11 mars 2011 Bonjour, Je commence depuis peu le bash, et je suis en train d'essayer de copier des fichiers d'un client à un serveur tftp. Lorsque j'écris : for file in /usr/local/file/* do tftp -p 172.16.x.x -l "${file}" -r `basename "${file}"` done Le code tend à marcher sans le faire vraiment, j m'explique: Lorsque je reçois les fichier le serveur reçoit trop de requete et me donne le log: Connection received from 172.16.x.x on port 38739 [11/03 23:29:31.747] Write request for file <echo.txt>. Mode octet [11/03 23:29:31.747] Using local port 53085 [11/03 23:29:31.748] <echo.txt>: rcvd 1 blk, 0 bytes in 0 s. 0 blk resent [11/03 23:29:31.799] Connection received from 172.16.x.x on port 35082 [11/03 23:29:31.838] Write request for file <hervé_motez.txt>. Mode octet [11/03 23:29:31.838] Using local port 53086 [11/03 23:29:31.838] Warning : received duplicated request from 172.16.x.x :35082 [11/03 23:29:31.892] <hervé_motez.txt>: rcvd 1 blk, 10 bytes in 0 s. 0 blk resent [11/03 23:29:31.900] Connection received from 172.16.x.x on port 35082 [11/03 23:29:32.142] Connection received from 172.16.x.x on port 45474 [11/03 23:29:32.142] Warning : received duplicated request from 172.16.x.x :45474 [11/03 23:29:32.142] Write request for file <salut2.txt>. Mode octet [11/03 23:29:32.142] Using local port 53087 [11/03 23:29:32.142] Write request for file <hervé_motez.txt>. Mode octet [11/03 23:29:32.143] Using local port 53088 [11/03 23:29:32.143] <salut2.txt>: rcvd 1 blk, 10 bytes in 0 s. 0 blk resent [11/03 23:29:32.193] File <hervé_motez.txt> : error 10054 in system call recv Une connexion existante a dû être fermée par l'hôte distant. [11/03 23:29:32.243] Connection received from 172.16.x.x on port 45474 [11/03 23:29:32.392] Warning : received duplicated request from 172.16.x.x :45474 [11/03 23:29:32.392] Write request for file <salut2.txt>. Mode octet [11/03 23:29:32.392] Using local port 53089 [11/03 23:29:32.392] File <salut2.txt> : error 10054 in system call recv Une connexion existante a dû être fermée par l'hôte distant. [11/03 23:29:32.443] Connection received from 172.16.x.x on port 45474 [11/03 23:29:32.642] Connection received from 172.16.x.x on port 38165 [11/03 23:29:32.642] Warning : received duplicated request from 172.16.x.x :38165 [11/03 23:29:32.642] Write request for file <shell.txt>. Mode octet [11/03 23:29:32.642] Using local port 53090 [11/03 23:29:32.642] Write request for file <salut2.txt>. Mode octet [11/03 23:29:32.643] Using local port 53091 [11/03 23:29:32.643] <shell.txt>: rcvd 1 blk, 221 bytes in 0 s. 0 blk resent [11/03 23:29:32.693] File <salut2.txt> : error 10054 in system call recv Une connexion existante a dû être fermée par l'hôte distant. [11/03 23:29:32.743] Connection received from 172.16.x.x on port 38165 [11/03 23:29:32.892] Warning : received duplicated request from 172.16.x.x :38165 [11/03 23:29:32.892] Write request for file <shell.txt>. Mode octet [11/03 23:29:32.892] Using local port 53092 [11/03 23:29:32.892] Connection received from172.16.x.x on port 38165 [11/03 23:29:33.142] Connection received from 172.16.x.x on port 38165 [11/03 23:29:33.142] Warning : received duplicated request from 172.16.x.x :38165 [11/03 23:29:33.142] Write request for file <shell.txt>. Mode octet [11/03 23:29:33.142] File <shell.txt> : error 32 in system call CreateFile Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus. [11/03 23:29:33.142] Write request for file <shell.txt>. Mode octet [11/03 23:29:33.142] File <shell.txt> : error 32 in system call CreateFile Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus. [11/03 23:29:33.142] Connection received from 172.16.x.x on port 38165 [11/03 23:29:33.392] Write request for file <shell.txt>. Mode octet [11/03 23:29:33.392] File <shell.txt> : error 32 in system call CreateFile Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus. [11/03 23:29:33.392] <shell.txt>: rcvd 0 blk, 0 bytes in 1 s. 0 blk resent [11/03 23:29:33.942] J'ai donc chercher à une solution pour qu'il n'envoi les fichiers qu'une seulle fois, et je suis parvenu à ce code, qui lui ne fonctionne pas sans que je ne sache pourquoi... NBFILE1=$(ls /usr/local/media | wc -l) # nombre de fichier dans le dossier for file in /usr/local/media/* do i=0 for (( c=1; c<=$NBFILE1; c++ )) do if [[ `basename "${file}"` == $list[c] ]] then i+=1 fi done if (( i==0)) then tftp -p 172.16.*.* -l "${file}" -r `basename "${file}"` list[c]='basename "${file}"` fi done , mais je vois pas ce qui ne fonctionne pas .... Merci d'avance pour votre aide.... Lien vers le commentaire Partager sur d’autres sites More sharing options...
foetus Posté(e) le 11 mars 2011 Partager Posté(e) le 11 mars 2011 Je n'ai rien pour tester, mais en fait c'est très mauvais comme programmation. Parce que je soupçonne que tu prends tout, les fichiers, les dossiers, mais aussi les liens (symboliques/ physiques) et aussi les dossiers "." et "..". Et donc, il faut un test fichier: #!/bin/bash # script plop.sh if [ ! -e "$1" ]; then echo "$1 n'existe pas" elif [ -f "$1" ]; then echo "$1 est un fichier" elif [ -d "$1" ]; then echo "$1 est un repertoire" fi Edit: Après vérification sous Mac, il prend les dossiers, mais ni le dossier '.' et ni le dossier '..'. Il faudrait savoir ce que fait la commande tftp lorsqu'on lui donne un dossier à manger. Lien vers le commentaire Partager sur d’autres sites More sharing options...
BarthVonRies Posté(e) le 12 mars 2011 Partager Posté(e) le 12 mars 2011 Si tu veux ne récupérer que les fichiers, tu peux tenter un for file in `ls -f /usr/local/media` Le flag -f ne prend que les fichiers. Enfin, si tu veux, tu peux faire un script récursif qui va uploader toute l'arborescence. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Dalaran Posté(e) le 14 mars 2011 Auteur Partager Posté(e) le 14 mars 2011 BarthBonRies, j'ai essayé ta ligne de code, mais rien n'y fait, elle ne parcourt pas mon dossier... mais je vais essayer de rajouter le flag -f et je vous tient au courant. Merci de votre aide. Lien vers le commentaire Partager sur d’autres sites More sharing options...
BarthVonRies Posté(e) le 14 mars 2011 Partager Posté(e) le 14 mars 2011 BarthBVonRies fais attention également, ce ne sont pas des apostrophes, mais des back quotes (apostrophes inversées, soit AltGR+è). Cela permet de faire évaluer la commande qu'ils encadrent avant la ligne de code à proprement parler. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Quiproquo Posté(e) le 19 mars 2011 Partager Posté(e) le 19 mars 2011 Plutôt que d'envoyer les fichiers un par un, il serait plus efficace de les envoyer tous d'un coup. Pour cela, il faut alimenter un ou plusieurs paramètres à chaque itération de ta boucle et invoquer une seule fois le client tftp après la fin de la boucle, avec comme argument la liste des fichiers à envoyer. Comme ça, tu n'ouvres qu'une seule connexion. Lien vers le commentaire Partager sur d’autres sites More sharing options...
L33thium Posté(e) le 29 mars 2011 Partager Posté(e) le 29 mars 2011 Je crois que ton problème viens du fait que tu lance une nouvelle connexion pour chaque fichier, au final tu en ouvre une nouvelle alors que la ou les derirnères n'ont pas eu le temps de se fermer, et tu sature peut être ta limite de nombres de connexions sur ce compte FTP. J'ai tapoté ça en vitesse qui dois envoyer tous les fichiers en une seule session FTP, le script FTP contient peut être des erreurs, ça fait longtemps que j'ai plus fait ça : ld="." # Dossier à parcourir rd="" # Dossier distant où uploader l="" # Pas touche # param FTP hostname="dtc.com" username="pouet" password="prout" for f in $ld/*; do [ -f "$f" ] && l=$l"put $f\n" done # Script FTP fs="quote USER $username\nquote PASS $password\n" expr length $rd >/dev/null 2>&1 && fs=$fs"\ncd $rd\n" fs=$fs"bin\n"$l"quit" ftp -inv $hostname <$fs en test run avec un echo $fs à la fin du script ça donne ceci : sh test.sh quote USER pouet quote PASS prout bin put ./gala put ./notes put ./test.sh quit Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.