Jump to content

Probleme sur parcourt de fichier


Recommended Posts

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

  • 2 weeks later...

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

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...