Comment supprimer un fichier nommé «filen / ame» (avec barre oblique) sur un système de fichiers ext4 dans debugfs?

26

En jouant avec e2fsprogs debugfs, par changement / accident, un fichier nommé a filen/ameété créé. De toute évidence, le caractère barre oblique /sert de caractère de séparation spécial dans les noms de chemin.

Toujours en utilisant, debugfsje voulais supprimer le fichier nommé filen/ame, mais j'ai eu peu de succès, car le /caractère n'est pas interprété comme faisant partie du nom de fichier?

Debugfs fournit-il un moyen de supprimer ce fichier contenant la barre oblique? Si c'est le cas, comment?

J'ai utilisé:

cd /tmp
echo "content" > contentfile
dd if=/dev/zero of=/tmp/ext4fs bs=1M count=50
mkfs.ext4 /tmp/ext4fs
debugfs -w -R "write /tmp/contentfile filen/ame" /tmp/ext4fs
debugfs -w -R "ls" /tmp/ext4fs

qui génère:

debugfs 1.43.4 (31-Jan-2017)
 2  (12) .    2  (12) ..    11  (20) lost+found    12  (980) filen/ame

J'ai essayé ce qui suit pour supprimer le filen/amefichier:

debugfs -w -R "rm filen/ame" /tmp/ext4fs

mais cela n'a pas fonctionné et n'a produit que:

debugfs 1.43.4 (31-Jan-2017)
rm: File not found by ext2_lookup while trying to resolve filename

Outre la modification manuelle du contenu du nœud de répertoire, existe-t-il un moyen de supprimer le fichier à l'aide de debugfs?

humanANDpeace
la source
Est-ce que l'échappement du forwardslash ( filen\/ame) ne fonctionne pas?
JAB
17
+1 et félicitations. Vous avez réussi à trouver l'un des deux seuls cas de "caractère bizarre dans le nom de fichier" où le simple fait de citer correctement et / ou d'échapper le caractère dans une commande shell ne résoudra pas le problème. (L'autre serait un octet nul dans un nom de fichier, bien que je soupçonne que, sur la plupart des systèmes de fichiers, cela tronquerait simplement le nom.)
Ilmari Karonen

Réponses:

33

Si vous voulez un correctif et que vous ne l'essayez pas seulement debugfs, vous pouvez demander à fsck de faire le travail pour vous. Marquez le système de fichiers comme sale et exécutez fsck -ypour obtenir le nom de fichier modifié:

$ debugfs -w -R "dirty" /tmp/ext4fs
$ fsck -y /tmp/ext4fs
 ...
/tmp/ext4fs was not cleanly unmounted, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Entry 'filen/ame' in / (2) has illegal characters in its name.
Fix? yes
 ...
$ debugfs -w -R "ls" /tmp/ext4fs
2  (12) .    2  (12) ..    11  (20) lost+found    12  (980) filen.ame   
meuh
la source
3
e2fscka une -foption orce qui mènera à une vérification complète «même si le système de fichiers semble propre».
David Foerster
3

Félicitations pour le fonctionnement de fsck; si pour une raison quelconque cela n'a pas fonctionné, la réponse est ls -i1suivie de umountpuis clri.

Réf: http://docstore.mik.ua/orelly/unix/upt/ch23_13.htm

J'ai effectivement testé cette méthode.

Joshua
la source
Si c'est Linux (ce qui semble être le cas), il convient de noter que ce clrin'est pas une commande distincte (comme c'est le cas sur certains autres systèmes Unix), c'est une sous-commande à l'intérieur debugfs.
hobbs
@hobbs: doit rendre le mien inhabituel alors. Oh attendez, nvm clri était juste un écho "clri $ 2" | debugfs "$ 1"
Joshua
Vos instructions nécessitent de toute façon l'exécution de fsck - ce qui résoudra le problème, avec le message Entry 'filen/ame' in / (2) has deleted/unused inode 12. Clear<y>?au lieu de celui noté dans l'autre réponse - mais faire le clri est une étape supplémentaire. Il ne semble pas y avoir de moyen de résoudre ce problème uniquement à partir de debugfs.
Random832
@ Random832: J'avais fsck pas le réparer par le passé. :(
Joshua
-1

Si vous déplacez le fichier vers un répertoire, vous pouvez ensuite supprimer le répertoire contenant le fichier.

mkdir foo 
mv filen* foo
rm -rf foo
carl
la source
1
Cela fonctionnerait pour tout autre nom de fichier maladroit, mais cela ne fonctionnera pas pour un nom de fichier qui y est /.
zwol