Le Fri, 21 Jan 2005 02:00:29 +0000
Yves Rutschle <[EMAIL PROTECTED]> a écrit:

> Salut,

> 
> Ok, tu t'es protégé contre plusieurs exécutions de ton
> script; mais que ce passe-t-il si un autre processus écrit
> dans le fichier? AMA il faudrait au moins flock-er le
> fichier.

Il ne doit pas y avoir d'autres processus qui écrivent dans ce fichier
en théorie, cela dit j'y avais pensé mais mettre un flock ne fait que
reculer le pbm, puisqu'il faut bien clore le fichier avant les
manoeuvres de rename/copy et il y aura un intervalle entre la fermeture
du fichier et le changement effectif. Or je tiens à ne pas éditer
directement le fichier pour conserver une copie au cas où(ça m'a servi
d'ailleurs:-))

> 
> >             print FIN $qui,":",$new_pwd,":",$fin,"\n";
> 
> Potentiellement, le print peut échouer (cas de disque plein
> par exemple).

Exact, mais si / est plein, le serveur est mal et dans ce cas, le script
échoue et /etc/passwd reste dans sa version originale. Simplement,
le script est bloqué puisqu'il subsiste le verrou /tmp/__script_pwd.
(cela dit, en l'occurrence, le disque n'était pas plein)

> 
> Et enfin:
> 
> 1> unlink ($RACINE.$PASS.".old");
> 2> rename $RACINE.$PASS , $RACINE.$PASS.".old";
> 3> rename $RACINE.$PASS_TMP , $RACINE.$PASS;
> 4> chown 0,0,$RACINE.$PASS;
> 
> Entre la ligne 2 et la ligne 3, il n'y a plus de fichier
> /etc/passwd. Si un autre programme suit le même algorithme
> et lit /etc/passwd entre ces deux lignes, il viendra ensuite
> réécrire un /etc/passwd vide. Je changerais ça en:
> 
> 1> unlink ($RACINE.$PASS.".old");
> 2> copy $RACINE.$PASS , $RACINE.$PASS.".old";
> 3> rename $RACINE.$PASS_TMP , $RACINE.$PASS;
> 4> chown 0,0,$RACINE.$PASS;

Modifications faites, merci de la suggestion. Pour l'histoire, à
l'époque où j'avais fait le script, je ne savais pas qu'il fallait faire
un

use File::Copy;

pour utiliser la fonction copie de fichier d'où ces unlink/rename.

> 
> Cela dit, si un autre programme a modifié /etc/passwd entre
> le moment où tu l'as ouvert et le moment où tu execute la
> ligne 4, tu vas perdres ces modifications...

> En fait, considérant l'importance de /etc/passwd, j'aurais
> tendance à réécrire le script entièrement en utilisant
> putpwent, qui, je suppose, prend toutes les précautions
> nécessaires. Ou bien en appellant passwd par le shell.


Là encore, j'ai appris après la rédaction du script qu'effectivement, il
y avait moyen de passer un mot de passe à passwd en ligne de commande
(option--stdin) et donc de s'en sortir par ce biais. Tu as sans doute
raison mais j'ai une certaine flemme...

Merci des tuyaux


François Boisson

Répondre à