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 à