OVH Cloud OVH Cloud

-e échoue parfois

14 réponses
Avatar
Asterbing
Bonjour. Sous ActivePerl/Apache2/Win2k, quelquefois (pas tjrs donc) le
test d'existence d'un fichier échoue alors que le chemin est correct.

Par exemple, ici parfois $fileok devient zéro, alors que $file existe
dans les faits.

if (! -e $file){$fileok = 0;}

Est-ce un pb de stabilité du -e ?

Est-ce une syntaxe non standard du chemin (il vient d'un formulaire et
je n'escape pas les "\", devrais-je ?) ?

Devrais-je tenter un open plutôt qu'un -e ?

Qu'en pensez-vous ?

4 réponses

1 2
Avatar
Asterbing
In article ,
says...
Les stations Windows sont en Win2K. Les fichiers sont sur unités en NTFS
ou FAT32. L'utilisateur est loggé en administrateur au moment de la
manip et peut normalement les lire et écrire.


Oui mais le script est lancé par l'utilisateur sous lequel tourne apache,
qui a probablement des droits très limités. Quel est l'utilisateur qui
fait tourner le serveur apache ? Dans quels groupes est il ? Quels sont
les droits sur les fichiers problématiques ? Par quels utilisateurs et
groupes sont ils lisibles ?



Bon, j'ai un problème : rien n'a été modifié ce week-end et ce lundi, ça
marche. Plus aucune erreur. Ca pourrait paraitre être une bonne
nouvelle, mais ça signifie aussi que je suis dans une situation
instable.

Sinon, pour ce qui est de l'utilisateur loggé du côté serveur Apache, il
s'agit de l'administrateur qui est aussi déclaré pour la machine cliente
comme appartenant au groupe "Utilisateurs" standard. D'ailleurs, en
accédant à cette machine via LAN, je peux lire, écrire, modifier,
effacer des fichiers.

Bref, ce matin, ça marche avec le script ci-dessous et je ne sais pas
pourquoi.

use strict;
print "Content-type: text/htmlnn";
my $file = 'C:/TEST/stats/histo.gif';
if (! -e $file){ print $file." not found : $!"; }
else { print $file." found"; }
exit 0;


Avatar
Asterbing
In article <442e8987$0$13233$,
says...
Dans l'article , a
dit...

In article ,
says...
Bonjour. Sous ActivePerl/Apache2/Win2k, quelquefois (pas tjrs donc) le
test d'existence d'un fichier échoue alors que le chemin est correct.


Pour faciliter le test, voici un script abrégé qui échoue parfois sur
certaines stations WIN32 d'un LAN, alors que ledit fichier existe bel et
bien dans le chemin donné pour cette station.

#!/usr/bin/perl
use strict;
print "Content-type: text/htmlnn";
my $file = "C:TESTstatshisto.gif";
if (! -e $file){ print $file." not found"; }
else { print $file." found"; }
exit 0;


Essayez quelque chose de plus proche du système en remplaçant les tests
'-e $file' par 'GetAttributes($file, $_)'
(C'est comme ça qu'on fait en C et c'est aussi plus rapide) :

#!/usr/bin/perl
use strict;
use Win32::File 'GetAttributes';

print "Content-type: text/htmlnn";
my $file = "C:TESTstatshisto.gif";
if (! GetAttributes($file, $_) ){ print $file." not found"; }
else { print $file." found"; }
exit 0;

et regardez si vous avez toujours des erreurs.

Le module Win32::File est normalement installé sur les Perl d'ActiveState
au moins depuis la version 5.005

HTH




Hum, je ne souhaite pas écrire quelque chose dépendant de l'OS : ce
script doit pouvoir être installé sur plateform Win32 qu'Unix flavors
(essentiellement FreeBSD).

Bon, sinon, le problème a évolué : rien n'a été modifié ce week-end
(dernier script en place ci-dessous) et ce lundi, ça marche. Plus aucune
erreur. Ca pourrait paraitre être une bonne nouvelle, mais ça signifie
aussi que je suis dans une situation instable. J'aurais préféré avoir un
vrai problème à régler :-(

use strict;
print "Content-type: text/htmlnn";
my $file = 'C:/TEST/stats/histo.gif';
if (! -e $file){ print $file." not found : $!"; }
else { print $file." found"; }
exit 0;



Avatar
Emmanuel Florac
Le Mon, 03 Apr 2006 10:57:36 +0200, Asterbing a écrit :


Sinon, pour ce qui est de l'utilisateur loggé du côté serveur Apache, il
s'agit de l'administrateur qui est aussi déclaré pour la machine cliente
comme appartenant au groupe "Utilisateurs" standard.


Non, visiblement tu n'as pas compris la notion de système d'exploitation
multi-utilisateurs. L'utilisateur qui est loggé sur la console du
serveur, on s'en cogne. Ce qu'on veut, c'est savoir par quel utilisateur
est lancé le programme "httpd.exe" d'apache. Il faut regarder dans le
gestionnaire des processus pour avoir cette info. Toute opération
effectué par le programme "httpd.exe" est faite avec les droits de cet
utilisateur.
Quand tu utilises un navigateur pour te connecter à ton serveur, c'est le
programme "httpd.exe" qui répond. Si tu lui dis de lancer un script perl
et d'ouvrir un fichier, il ouvrira le fichier avec les droits particuliers
liés à l'utilisateur qui fait tourner le service (Apache, httpd, nobody,
je ne sais) et PAS DU TOUT avec les droits de l'utilisateur qui utilise le
navigateur et encore moins avec les droits de l'utilisateur actuellement
loggé sur la console de la machine.
Les fichiers créés sur le disque par chaque utilisateur POTENTIEL du
système peuvent avoir des droits également divers et variés, il faut
vérifier les propriétés détaillées des fichiers problématiques.


--
Sutor ne ultra Crepidam.

Avatar
Asterbing
In article ,
says...
Le Mon, 03 Apr 2006 10:57:36 +0200, Asterbing a écrit :


Sinon, pour ce qui est de l'utilisateur loggé du côté serveur Apache, il
s'agit de l'administrateur qui est aussi déclaré pour la machine cliente
comme appartenant au groupe "Utilisateurs" standard.


Non, visiblement tu n'as pas compris la notion de système d'exploitation
multi-utilisateurs. L'utilisateur qui est loggé sur la console du
serveur, on s'en cogne. Ce qu'on veut, c'est savoir par quel utilisateur
est lancé le programme "httpd.exe" d'apache. Il faut regarder dans le
gestionnaire des processus pour avoir cette info. Toute opération
effectué par le programme "httpd.exe" est faite avec les droits de cet
utilisateur.
Quand tu utilises un navigateur pour te connecter à ton serveur, c'est le
programme "httpd.exe" qui répond. Si tu lui dis de lancer un script perl
et d'ouvrir un fichier, il ouvrira le fichier avec les droits particuliers
liés à l'utilisateur qui fait tourner le service (Apache, httpd, nobody,
je ne sais) et PAS DU TOUT avec les droits de l'utilisateur qui utilise le
navigateur et encore moins avec les droits de l'utilisateur actuellement
loggé sur la console de la machine.
Les fichiers créés sur le disque par chaque utilisateur POTENTIEL du
système peuvent avoir des droits également divers et variés, il faut
vérifier les propriétés détaillées des fichiers problématiques.





Bon, mais quel que soit cet utilisateur associé à httpd.exe, il n'a pas
changé entre vendredi et aujourd'hui... Alors, pourquoi donc cela
marche-t-il maintenant ?


1 2