Aller au contenu
View in the app

A better way to browse. Learn more.

Next

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Probleme sur parcourt de fichier

Featured Replies

Posté(e)

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

Posté(e)

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.

Posté(e)

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.

Posté(e)
  • Auteur

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.

Posté(e)

BarthBVonRies

:|:pleure::baton::prof:

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.

Posté(e)

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.

  • 2 semaines après...
Posté(e)

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.