Fichiers moisis

Il peut arriver que des fichiers ou dossiers de votre site soient impossible à effacer "normalement".
L'une des principales raisons en est un nom du fichier complètement aberrant, par exemple commençant ou finissant par des espaces.
Sans l'utilisation plus ou moins acrobatique d'un client FTP en ligne de commande, une solution est de les renommer/effacer par un script PHP.
Mais avant cela essayer les manips "évidentes", en particulier le "WEB FTP" de free : http://ftpperso.free.fr, Interface déclaré "expérimental" mais qui peut parfois débloquer la situation.

Quel est mon nom ?

La première question est de savoir le nom exact de ce fichier véreux.
Une possibilité est d'utiliser le "Index of" généré automatiquement par le serveur Apache en l'absence d'un fichier index.html ou index.php (et si pas bloqué par un "Options -Indexes" du .htaccess).
Pour une fois que le "Index of" est utile à quelque chose !
On peut ainsi parcourir l'arborescence pour voir le nom réel des fichiers.
Au besoin, renommer provisoirement les index.html/php existants, et commenter la ligne en '#Options -Indexes'.
L'affichage du nom ne faisant pas de différence entre les différentes sortes d'espaces, le plus sûr est de récupérer l'URL du fichier.
C'est ce qui est affiché dans la barre d'état du navigateur en survolant le lien.
On peut le copier/coller avec un clic droit et "copier le raccourci"
On obtient alors quelque chose du genre http://monsite.free.fr/chemin/%20toto.php
Tous les %xx représentent un caractère de code ASCII xx en hexadécimal.
Ainsi %20 est un espace ordinaire et le nom réel du fichier est  toto.php incluant un espace au début !
Note :Utiliser le nom réel en PHP, pas les %xx !! les %xx c'est uniquement en http.

Renommage individuel

Un script PHP pour renommer un fichier ou dossier individuel est d'une simplicité biblique :
Le script ci dessous est à copier dans un fichier renommer.php, à placer à la racine du site.
Bien entendu on remplace les monchemin et  monnom par ce qu'il faut effectivement renommer !
Si un dossier à renommer a pour URL http://monsite.free.fr/monchemin/%20monnom
C'est à dire l'adresse relative par rapport à la racine du site : 'monchemin/ monnom'
Les noms sont tel quel et complets, avec extension éventuelle (.txt, .php, .html etc) incluse, et casse (majuscule/minuscule) respectée.

On l'exécute par http://monsite.free.fr/renommer.php
On doit voir s'afficher une page blanche sans message d'erreur
Puis il ne sert plus à rien, on l'efface.


<?php
rename('monchemin/ monnom', 'monchemin/monnom');
?>
 

Il renomme monchemin/ monnom en monchemin/monnom, supprimant l'espace devant le  monnom
Si  monnom est directement à la racine, le chemin est inutile : rename(' monnom', 'monnom');

Ce script très simple ne récupère pas les erreurs, en particulier l'existence préalable d'un fichier avec le même nom sans espace.
Par exemple si il y a déja les deux fichiers ou dossiers monchemin/ monnom et monchemin/monnom
le renommage de monchemin/ monnom en monchemin/monnom échoue, ou provoque des effets de bord inattendus.
Si tel est le cas il faut renommer en un autre nom, garanti pas déja existant :
rename('monchemin/ monnom', 'monchemin/autrenom');

Note : Les chemins sont en relatif par rapport à là où se trouve le script, noms réels mais sans rajouter un iota (ni / ni % supplémentaires)

Si on a quelques dossiers ou fichiers à renommer on peut dupliquer la ligne rename, mutatis mutandis comme on dit.

Pour un fichier, si le but est finalement de l'effacer, on peut directement l'effacer en PHP en remplaçant
rename('monchemin/ monnom.ext', 'monchemin/monnom.ext');  par :
unlink('monchemin/ monnom.ext');.
Ceci (unlink) ne fonctionne pas pour un répertoire.

Note :
Il est plus propre de séparer le chemin du nom terminal par une variable intermédiaire, particulièrement si 'monchemin' est assez long, ou plusieurs fichiers à renommer :


<?php
$chemin = 'monchemin';
 
rename($chemin.'/ monnom1', $chemin.'/monnom1');
rename($chemin.'/ monnom2 ', $chemin.'/monnom2');
// ... autant de rename qu'il le faut
?>
 

Si on a la hantise de la page blanche et si on veut une confirmation positive que le script s'est exécuté, on peut le complèter par l'affichage d'un message :


<?php
$chemin = 'monchemin';
rename($chemin.'/ monnom1', $chemin.'/monnom1');
if (is_dir($chemin.'/monnom1') || is_file($chemin.'/monnom1')) { 
  echo '<p>Renommage effectué</p>';
}
?>
 

Note : Chemins absolus
Si on tient absolument à utiliser des chemins ... absolus, ne pas oublier que '/' n'est pas la racine du site en PHP, mais la racine du disque dur du serveur !
Ainsi '/monchemin' ne sera certainement pas trouvé !
Chez Free le répertoire voulu sera à un chemin absolu du genre : '/mnt/105/sdb/c/e/monsite/monchemin'
Sans garantie de pérennité de ce chemin absolu (migrations de serveurs etc...)
La bonne méthode étant d'utiliser $_SERVER['DOCUMENT_ROOT'].'/monchemin'

Parcours de l'arborescence

Un script qui renommerait automatiquement tous les fichiers ou répertoires est risqué, particulièrement en cas de fichiers trop nombreux (surcharge du serveur).
Un script interactif, permettant de parcourir et renommer au choix est certes possible, mais le jeu n'en vaut pas la chandelle : ce script ne serait utilisé qu'une fois tous les 36 du mois, c'est à dire si et seulement si on est bloqué par des problèmes de noms pourris de fichiers.

Effacement de répertoires

Il n'est normallement pas possible d'effacer des répertoires par PHP chez Free.
La fonction rmdir ne fait simplement rien.
Il existe néanmoins une "astuce" qui utilise un effet de bord de la fonction rename.
Avec certains serveurs, en particulier chez Free, si on renomme un répertoire vide en un autre répertoire existant et vide, le 1er est effacé !
On peut ainsi renommer tous les répertoires à effacer en un même répertoire "trash" par exemple.
A la fin il ne reste plus que ce répertoire "trash", qu'on peut effacer à la main par FTP.

Là aussi on peut imaginer un script qui parcours récursivement l'arborescence choisie et efface tout sur son passage.
Ceci est fortement déconseillé s'il risque d'y avoir des centaines de fichiers/dossiers.
De plus un tel script basé sur un "effet de bord" non documenté du rename... bof.
De toute façon, dès que les noms sont de nouveau corrects (par le renommage précédent) tout est effaçable par la méthode normale : le FTP.

Site bloqué - FTP en ligne de commande

Tout ceci suppose que le site est accessible en HTTP (index_of, scripts php)
Si le site est bloqué, et que seul l'accès FTP a été rétabli, seul l'usage d'un client FTP en ligne de commande est possible.
Ceci est toutefois assez acrobatique car les espaces sont généralement filtrés dans la commande avant l'envoi et dans les listes affichées.
Jongler avec le quotage (" toto") dépend de l'O.S. et ne résoud pas vraiment le problème.
Le renommage nécessite l'envoi successif de deux commandes sur la liaison FTP : RNFR+nom d'origine, puis RNTO+nouveau nom
La commande "rename" du client FTP n'est pas une vraie commande mais une macro qui fabrique ces deux commandes sur la liaison, on ne s'en sort pas vraiment : le rename est interprété, avec filtrage des espaces superflus.
Le RNFR+RNTO nécessite que le client FTP n'ajoute rien de lui même (commandes de "maintien de connexion") entre ces deux commandes.
Il faut aussi s'assurer que le client en ligne de commande ne fait pas d'autres filtrages intempestifs.
par exemple RNFR ./ toto compris comme RNFR ./ et tout ce qui suit filtré et pas transmis sur la liaison.
Il faut enfin taper ces commandes dans le délai ridiculement court du timeout chez Free (tout faire en moins de 30s) !

Une façon efficace de s'en sortir est de préparer un fichier de commandes.
Par exemple sous Windows on prépare un fichier commandes.txt (ici C:\temp\commandes.txt) avec

open ftpperso.free.fr
xxxxxx      (le nom du site)
**********  (le mot de passe)
cd monchemin
quote RNFR ./ monnom
quote RNTO monnom
quit
 
Puis on l'envoie vers le serveur par la commande (en ligne de commande, dans une fenêtre "MS-DOS")
   C:\temp>ftp -s:commandes.txt
(en se plaçant dans le répertoire qui contient le fichier commandes.txt)

On obtient le résultat suivant (avec ajout de commandes dir pour voir "avant" et "après" le rename)

ftp> open ftpperso.free.fr
Connecté à ftpperso.free.fr.
220 Serveur de mise a jour des pages perso de Free.fr version [May  5 2008 15:14:30]
Utilisateur (ftpperso.free.fr:(none)) :
331 Password required for xxxxxx.

230 User xxxxxx logged in.
ftp>
ftp> dir
200 PORT command successful.
150 Opening ASCII mode data connection for file list
drwx------   6 web site      600 Oct 19 16:46 .
drwx------   6 web site      600 Oct 19 16:46 ..
drwx------   3 web site       72 Oct 19 11:12  monnom
  [ ... ]
226 Transfer complete.
ftp : 1178 octets reçus dans 0.05 Secondes 23.56Ko/sec.
ftp> quote RNFR ./ monnom
350 File or directory exists, ready for destination name.
ftp> quote RNTO monnom
250 Rename successful
ftp> dir
200 PORT command successful.
150 Opening ASCII mode data connection for file list
drwx------   6 web site      600 Oct 19 16:46 .
drwx------   6 web site      600 Oct 19 16:46 ..
drwx------   3 web site       72 Oct 19 11:12 monnom
  [ ... ]
226 Transfer complete.
ftp : 1177 octets reçus dans 0.05 Secondes 23.54Ko/sec.
ftp> quit
221 Goodbye.

 
C:\temp>
Noter l'espace suplémentaire avant monnom dans le résultat du 1er dir.
Cette commande dir en ligne de commande permet donc d'afficher les espaces ! Elle permet ainsi de savoir les noms exacts.
Ici le répertoire monnom était directement à la racine, et le cd monchemin inutile.
La macro quote envoie telle quelle la commande FTP indiquée sur la liaison FTP

D'autres clients en ligne de commande que celui de Windows nécessitent une adaptation de cette procédure.
On peut aussi (mais comme déja dit, acrobatique) utiliser la ligne de commande de Filezilla (par exemple)
Menu serveur - entrer une commande FTP, une commande à la fois.
Il faut de toute façon paramétrer Filezilla en supprimant "Activer le système anti déconnexions" dans le menu édition - paramètres - connexion
Ne pas oublier qu'il faut tout taper en moins de 30s !

Il reste les espaces en fin de nom, que l'operating system ou le client FTP peut filtrer de son propre chef avant envoi de la commande (entre le clavier et la liaison FTP). Et là il faut jongler avec le quotage. Passage obligé si le nom ne contient que des espaces !
Selon l'O.S. et le client employé ceci peut s'avèrer impossible.
On peut alors avoir besoin de rouvrir l'accès HTTP pour renommer en PHP.
Bien entendu, on peut pour des raisons de sécurité n'ouvrir l'accès qu'au seul détenteur du compte, provisoirement.
Voir .htacces

Sommaire informatique Accueil Mail