Salut, Je vois deux problèmes potentiels:
> # attend une éventuelle fin > while (-e "/tmp/__script_pwd") { > } > #Path securité > $ex_path = $ENV{"PATH"}; > $ENV{"PATH"} = "/bin:/usr/bin"; > > #let'sgo 1) drapeau > system("touch /tmp/__script_pwd"); 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. > print FIN $qui,":",$new_pwd,":",$fin,"\n"; Potentiellement, le print peut échouer (cas de disque plein par exemple). 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; (rename est garanti atomique, donc ne pose pas de problèmes de concurrence). 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. Y.