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

