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