¿Cómo eliminar un archivo llamado "filen / ame" (con barra) en un sistema de archivos ext4 en debugfs?

26

Jugando con e2fsprogs debugfs, por cambio / accidente, filen/amese creó un archivo llamado . Obviamente, el carácter de barra diagonal /sirve como el carácter separador especial en los nombres de ruta.

Todavía usando debugfs, quería eliminar el archivo nombrado filen/ame, pero tuve poco éxito, ya que el /carácter no se interpreta como parte del nombre del archivo.

¿Debugfs proporciona una forma de eliminar este archivo que contiene la barra inclinada? ¿Si es así, cómo?

Solía:

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

que salidas:

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

Intenté lo siguiente para eliminar el filen/amearchivo:

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

pero esto no funcionó y solo produjo:

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

Además de cambiar el contenido del nodo del directorio manualmente, ¿hay alguna forma de eliminar el archivo usando debugfs?

humanidad y paz
fuente
¿Escapar del forwardslash ( filen\/ame) no funciona?
JAB
17
+1, y felicidades. Se las arregló para encontrar uno de los dos únicos casos de "caracteres extraños en el nombre del archivo" en los que simplemente citar y / o escapar correctamente del carácter en un comando de shell no resolverá el problema. (El otro sería un byte nulo en un nombre de archivo, aunque sospecho que, en la mayoría de los sistemas de archivos, eso solo truncaría el nombre.)
Ilmari Karonen

Respuestas:

33

Si desea una solución y no solo está probando debugfs, puede hacer que fsck haga el trabajo por usted. Marque el sistema de archivos como sucio y ejecútelo fsck -ypara cambiar el nombre del archivo:

$ 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
fuente
3
e2fscktiene una -fopción de orce que llevará a una verificación completa "incluso si el sistema de archivos parece limpio"
David Foerster
3

Felicitaciones por trabajar fsck; si por alguna razón no funcionó, la respuesta es ls -i1seguida por umounty luego clri.

Ref: http://docstore.mik.ua/orelly/unix/upt/ch23_13.htm

De hecho, he probado este método.

Joshua
fuente
Si se trata de Linux (que parece), vale la pena señalar que clrino es un comando separado (como lo es en algunos otros sistemas Unix), es un subcomando dentro debugfs.
hobbs
@hobbs: debe hacer que el mío sea inusual entonces. Oh espera, nvm clri era solo echo "clri $ 2" | debugfs "$ 1"
Joshua
Sus instrucciones requieren ejecutar fsck de todos modos, lo que solucionará el problema, con el mensaje en Entry 'filen/ame' in / (2) has deleted/unused inode 12. Clear<y>?lugar del indicado en la otra respuesta, pero hacer el clri es un paso adicional. No parece haber una manera de resolver esto únicamente desde dentro de debugfs.
Random832
@ Random832: tenía fsck que no lo solucionó por sí solo en el pasado :(
Joshua
-1

Si mueve el archivo a un directorio, puede eliminar el directorio que contiene el archivo.

mkdir foo 
mv filen* foo
rm -rf foo
carl
fuente
1
Esto funcionaría para cualquier otro nombre de archivo incómodo, pero no funcionará para un nombre de archivo que contenga /.
zwol