Suppression de fichiers et dossiers impossible ? Pas si sûr…

Les Pages Perso Chez Free

Par Al, le , dans En cas de problème. / Dernière modification : le par Al (merci à Jm, CleyFaye, Philippe 92 et Thomas).
Tags : Apache, Phishing, PHP, Tutoriaux, Stockage, Suspension

Un sujet revient régulièrement sur le forum Usenet des pages Perso de Free : la suppression de fichiers récalcitrants « impossibles » à supprimer. Est-ce vraiment si sûr ? Voici quelques conseils et ressources pour tenter d'en venir à bout. Cet article est en partie basé sur le très bon tutoriel de Philippe 92 : Fichiers moisis.

Quelques règles de base concernant la dénomination des fichiers sur un serveur web

Un serveur web est un logiciel qui offre à ses visiteurs des fichiers sous un protocole spécifique : HTTP. Or, ce protocole est « ancien » (pour l'informatique ;-)) et peut poser des problèmes avec les noms de fichiers qui ne sont pas basés sur les caractères ASCII (a-zA-Z0-9-_.,). Leur lecture, édition et suppression peut s'avérer difficile, si ils contiennent des espaces avant ou après le nom, des caractères accentués, ou si les fichiers à supprimer sont trop nombreux, car le « timeout » est de 45 secondes sur les serveurs FTP de Free. Privilégiez également les caractères minuscules.

Les méthodes simples

Les méthodes « simples » n'impliquent que des petites « astuces » qui peuvent se révéler utiles pour finalement supprimer les fichiers qui peuvent poser problèmes.

1. Rafraichissement du cache du listing FTP du répertoire

Votre logiciel client FTP peut peut-être disposer d'une liste obsolète des fichiers présent dans le répertoire. Tentez de rafraichir cette liste (via votre client FTP) et vous serez sans doute à même de supprimer les fichiers et répertoires qui vous posent problème sans autres actions à réaliser.

2. Affichez les répertoires et fichiers cachés

Par défaut, sur un système Unix, les fichiers débutant par un point (comme le fameux fichier « .htaccess ») sont masqués de la vue courante de la liste des fichiers présent dans le répertoire.

Tous les bons clients FTP disposent d'une options permettant d'afficher les fichiers cachés. Activez-la si ce n'est pas encore le cas, afin de visualiser d'éventuel fichiers « cachés » encore présents et interdisant la suppression des répertoires.

3. Tentez de renommer ce qui pose problème

Dans les cas les plus simples, il est possible de tenter de renommer les fichiers ou les répertoires depuis votre client FTP ou depuis le webFTP de Free. Choisissez un nom simple et court, sans accentuation, ponctuation ou symboles et supprimez ensuite ces éléments via votre client FTP.

4. Le webFTP de Free

Bien que encore présentée comme « expérimentale », l'interface webFTP de Free peut s'avérer très utile pour renommer ou supprimer des fichiers ou des répertoires. N'hésitez pas à l'utiliser avant de recourir aux méthodes plus lourdes, présentées ci-dessous.

5. Changez de client FTP

Il se peut que votre client FTP ne puisse pas supprimer certains fichiers ou répertoires en raison de noms « exotiques ». Vous pouvez essayer d'autres clients FTP afin de tenter une suppression, ils se révèleront peut-être efficaces.

Les méthodes plus lourdes

Comme nous l'avons indiqué précédemment, le serveur FTP des pages perso de Free dispose d'un « timeout » de 45 secondes. C'est-à-dire qu'une opération (une commande) ne peut excéder 45 secondes. Ce délai est amplement suffisant dans le cas de manipulations simples de fichiers et répertoires. Il peut cependant être très limitant dans le cas de suppression de nombreuses archives images d'une webcam, par exemple. Dans ces cas, il faut recourir à des méthodes plus « lourdes », par scripts PHP ou par FTP en ligne de commande.

1. Suppression de fichiers en ligne de commande

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. ftp est l'outil de base pour accéder aux serveurs ftp par ligne de commande. Il ne s'agit pas du meilleur outil, mais il offre toutes les fonctionnalités de base, et est installé par défaut sur la plupart des systèmes. D'autres clients très performants pour Mac et Linux sont lftp (site officiel et francophone) et NcFTP Client pour Windows.

Sous Windows, pour lancer ftp, il faut se rendre dans le menu « Démarrer », puis cliquer sur « Exécuter ». Dans l'invite de commande MSDOS, taper la commande ftp et appuyer sur Entrer.

Sous Linux, Unix et Mac, lancer le terminal et taper la commande ftp.

Vous avez maintenant accès à l'invite de commande, entrez la commande suivante pour vous connecter sur le serveur FTP des pages perso de Free :

ftp> open ftpperso.free.fr

Identifiez-vous avec l'identifiant et le mot de passe FTP de votre compte Pages Perso. Et vous pouvez débuter.

Les commandes FTP (extrait)
  • ! : Permet de repasser au shell (ligne de commande)
  • ? : Affiche les informations d'aide locales
  • cd : Change le dossier de travail distant
  • close : Termine la session ftp
  • dir : Liste le contenu du dossier distant (sur Windows)
  • get : Pour télécharger le dossier distant
  • help : Pour obtenir de l'aide
  • lcd : Pour changer de répertoire local
  • lls : Liste les fichiers du répertoire local
  • ls : Liste les fichiers du répertoire local sur la machine distante
  • mkdir : Crée un dossier sur la machine distante
  • mget : Permet de récupérer plusieurs fichiers sur la machine distante (utiliser * comme symbole d'échappement. Par exemple _dscn*)
  • mdelete : Supprime plusieurs fichiers sur la machine distante (utiliser * comme symbole d'échappement. Par exemple _dscn*)
  • mput : Permet d'envoyer des fichiers sur la machine distante (utiliser * comme symbole d'échappement. Par exemple _dscn*)
  • open : Ouverture d'une connexion ftp distante
  • prompt : Active ou désactive l'interactivité sur les commandes suivantes
  • put : Envoie un fichier sur la machine distante
  • pwd : Donne le chemin actuel sur la machine distante
  • rename : Renomme le fichier
  • rm : Efface le fichier sur la machine distante
  • rmdir : Supprime le répertoire sur la machine distante

Plus d'informations sur :

2. Les scripts PHP

Les scripts PHP sont des outils puissants qui permettent d'interagir avec les données présentes sur votre compte. Il faut cependant prendre en considération la sécurité de ces scripts. Il faut les déposer sur votre site web uniquement le temps nécessaire à vos opérations, puis les supprimer de votre espace web. Il est recommandé de limiter l'accès à ces scripts où à votre site à votre seule adresse IP, par l'une des directives suivantes dans un fichier .htaccess (et où 000.000.000.000 correspond à votre adresse IP externe) :

Limiter l'accès au script uniquement :

<Files "monscript.php">
Order Allow,Deny
Allow from 000.000.000.000
Deny from all
</Files>

ou à l'ensemble du site internet (si par exemple vous devez réaliser des modifications avant remise en ligne du site) :

Order Allow,Deny
Allow from 000.000.000.000
Deny from all

Ces scripts doivent également être paramétrés correctement sur votre propre machine (avec un éditeur de texte brut ou le bloc-note du système) avant d'être envoyé sur votre propre site, afin de ne pas affecter d'autres éléments de votre compte pendant leur exécution. Il importe également de faire attention à l'encodage de vos scripts lors de l'utilisation de script de suppression ou de changement de nom de fichier.

1. Renommer via un script PHP

Le premier problème à résoudre sera de définir le nom « réel », sur le serveur, du fichier que l'on souhaite renommer et, éventuellement, détruire par la suite. Pour ce faire, il est possible d'utiliser les listing automatiques de répertoires du serveur Apache. Renommer pour cela vos fichiers index.<extension> et/ou autorisez le listing de répertoire via .htaccess.

Une fois le nom du fichier connu. 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, y compris les espaces éventuels en début ou fin de nom, il est possible de le renommer via le script suivant (il est possible de renommer plusieurs éléments en même temps, en dupliquant les fonctions PHP rename()) :

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

Ce script est également téléchargeable via le « Kit d'effacement par scripts PHP », disponible ⬇︎ ici. Attention : modifiez, adaptez et testez ce script en local, sur votre machine avant de le déposer et de l'exécuter sur votre compte Pages Perso, directement à la racine de votre compte.

Lancez le script en vous rendant à l'adresse URL correspondante à celui-ci : http://monsite.free.fr/mon-script.php

Une fois l'opération terminée, supprimez le script et les fichiers et répertoires souhaités et reconfigurez le serveur (fichiers index, listing de répertoire, etc.).

2. Supprimer via un script PHP

Il est possible également de supprimer les fichiers (mais pas les répertoires) concernés dans une même opération (il est également possible de dupliquer les commandes PHP unlink() pour traiter plusieurs fichiers dans la même opération), avec le script PHP suivant :

<?php
$chemin = $_SERVER['DOCUMENT_ROOT'].'/monchemin';
unlink($chemin.'/ monnom1.ext');
?>

Ce fichier fait partie du « Kit d'effacement par scripts PHP », disponible ⬇︎ ici. Attention : modifiez, adaptez et testez ce script en local, sur votre machine avant de le déposer et de l'exécuter sur votre compte Pages Perso, directement à la racine de votre compte.

Une fois correctement paramétré et transéré sur le serveur, lancez votre script en vous rendant sur l'adresse URL correspondante : http://monsite.free.fr/mon-script.php

Une fois l'opération terminée, supprimez le script et les fichiers et répertoires souhaités et reconfigurez le serveur (fichiers index, listing de répertoire, etc.).

La méthode expéditive

Si vous souhaitez vider un répertoire contenant un très grand nombre de fichiers et répertoires, et que votre client FTP ne peut terminer l'opération correctement en raison du timeout du serveur FTP de Free, le script PHP d'effacement récursif semble tout indiqué.

Il existe deux excellents tutoriaux en français disponibles sur le net.

Effacement récursif d'un répertoire

<?php
// Ce script php est à uploader juste au dessus du répertoire à effacer.
// Donner le nom exact du répertoire sans slash derrière (ex: './test')
$effacerep='./test';
echo "Effacement récursif du répertoire : ", $effacerep, '<br /><br />';
function effacerepertoire($dir) {
if (is_dir ($dir)) // si c'est un répertoire
$dh = opendir ($dir); // on l'ouvre
else {
echo $dir, ' n\'est pas un répertoire valide !'; // sinon on sort ! Appel de fonction non valide !
exit;
}
while (($file = readdir ($dh)) !== false ) { //boucle pour trouver le contenu du répertoire
if ($file !== '.' && $file !== '..') { // no comment
$path =$dir.'/'.$file; // construction du chemin du fichier
if (is_dir ($path)) { //si on tombe sur un sous-répertoire
echo '<p style="font-weight: bold; border : 1pt solid #000000;">', $path, '</p>';
echo '<div style="padding-left: 20px; border: 1pt dashed #000000;">'; // idem...
effacerepertoire($path); // // appel recursif pour lire a l'intérieur de ce sous-répertoire
echo '</div><br />';
echo "Effacement du répertoire : ",$path,'<br />';
rmdir($path);
}
else {
echo "Effacement du fichier : ",$path, '<br />';
unlink($path);
}
}
}
closedir ($dh); // on ferme le répertoire courant
}
effacerepertoire($effacerep);
echo '<p style="font-weight: bold; border : 1pt solid #000000;">', "Effacement du répertoire : ", $effacerep, '</p>';
rmdir($effacerep);
?>

Ce script doit être placé, par ftp, juste au dessus du répertoire à effacer. Il faut préciser dans le code (donc avant le transfert par ftp) le nom exact du répertoire à effacer, sans slash (/) à la fin. Il ne restera plus qu'à supprimer les (sous-)répertoires présents, car la fonction rmdir() n'est pas fonctionnelle sur l'hébergement de Free.

Un effet de bord non garanti de la commande rename() permet de contourner cette limitation à peu près. On renomme le répertoire à effacer, une fois vidé, vers un autre répertoire, toujours le même. Tous ces rename() de répertoires vides vont alors superposer tous ces répertoires vides en un seul, tout aussi vide, que l'on peut alors effacer « à la main », une fois l'opération terminée, par FTP. On remplace ainsi toutes les commandes rmdir($path) par :

@rmdir($path); // (effacement normal ailleurs que chez Free)
if (is_dir($path)) { // l'effacement a échoué
rename($path,'trash'); // rename "spécial Free" (effet de bord non garanti de rename)
}

Comme dans les scripts le répertoire courant est constant, trash est toujours le seul et unique répertoire ./trash, quel que soit le niveau de $path dans l'arborescence.

Le répertoire ./chemin/répertoire/sous-répertoire devient ainsi ./trash, ce qui permet de vider ./chemin/répertoire de tous ses sous-répertoires et ce, récursivement. In fine, le répertoire ./chemin lui-même est « télescopé » sur le répertoire ./trash qui reste le seul à effacer à la main, avec un nom « standard » et totalement vide.

Pour effacer l'ensemble du compte, il suffit de préciser . à la place du répertoire (le script doit alors être placé à la racine du compte). Le script effacera le répertoire dans lequel se trouve le script, y compris le script lui-même. Mais ceci ne pose pas de problème, en principe, (à voir selon le système d'exploitation de Free) puisque, toujours en principe, le script n'est exécuté qu'une fois lu en entier par l'exécuteur PHP.

Ce script est également téléchargeable via le « Kit d'effacement par scripts PHP », disponible ⬇︎ ici. Attention : modifiez, adaptez et testez ce script en local, sur votre machine avant de le déposer et de l'exécuter sur votre compte Pages Perso, directement à la racine de votre compte ou dans le dossier contenant celui que vous souhaitez effacer.

Notez également que les scripts d'effacement récursif présents dans le « kit », une fois lancés, effacent l'ensemble du compte (ou du contenu du dossier configuré) sur lesquels ils sont déposés. Pensez-donc à sauvegarder les données importantes, car en cas de mauvaise configuration ou manipulation, toutes les données effacées seront perdues et non-récupérables.

Lancez le script en vous rendant à l'adresse URL correspondante à celui-ci : http://monsite.free.fr/chemin/vers/mon/script.php

Une fois l'opération terminée, supprimez le script et reconfigurez le serveur (fichiers index, listing de répertoire, etc.).

Suppression sélective de certains fichiers dans un répertoire donné

Le script suivant permet de supprimer les fichiers voulus (images Jpeg, en l'occurence) plus anciens qu'une date définie dans un répertoire donné. Ce script est adapté de celui proposé par OpenClassroom ici.

<?php
// Paramétrage de la fonction (dossier traité : '.' pour le répertoire dans lequel est placé le script , extension choisie, âge requis : '0' pour désactiver).
suppression( 'webcam' , 'jpg' , '0' );

// La fonction en question.
function suppression($dossier_traite , $extension_choisie, $age_requis) {

// On ouvre le dossier.
$repertoire = opendir($dossier_traite);

// On lance la boucle qui lira les fichiers un par un.
while(false !== ($fichier = readdir($repertoire))) {
// On met le chemin du fichier dans une variable simple.
$chemin = $dossier_traite.'/'.$fichier;
                
// On n'oublie pas LA condition sous peine d'avoir quelques surprises. :p
if($fichier!='.' AND $fichier!='..' AND !is_dir($fichier)) {
unlink($chemin);
 }
}
// On ferme !
closedir($repertoire);
}
?>

Si vous utilisez PHP 5.6.x sur votre compte, il est possible d'utiliser un script plus simple pour arriver au même résultat, tel que celui-ci :

<?php array_map('unlink', glob('*.jpg')); ?>