Jak usunąć plik o nazwie „filen / ame” (z ukośnikiem) w systemie plików ext4 w debugfs?

26

Grając z e2fsprogs debugfs, przez zmianę / wypadek utworzono plik o nazwie filen/ame. Oczywiście ukośnik /służy jako specjalny znak separatora w ścieżkach.

Nadal za pomocą debugfschciałem usunąć plik o nazwie filen/ame, ale miałem mały sukces, ponieważ /znak nie jest interpretowany jako część nazwy pliku?

Czy debugfs zapewnia sposób na usunięcie tego pliku zawierającego ukośnik? Jeśli tak to jak?

Użyłem:

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

które wyjścia:

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

Próbowałem wykonać następujące czynności, aby usunąć filen/ameplik:

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

ale to nie zadziałało i spowodowało jedynie:

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

Czy oprócz ręcznej zmiany zawartości węzła katalogu istnieje sposób na usunięcie pliku za pomocą debugfs?

ludzkośćANDpeace
źródło
Czy unikanie funkcji Forwardslash ( filen\/ame) nie działa?
JAB
17
+1 i gratulacje. Udało ci się znaleźć jeden z dwóch przypadków „dziwnego znaku w nazwie pliku”, w którym zwykłe cytowanie i / lub ucieczka znaku w poleceniu powłoki nie rozwiąże problemu. (Drugi to bajt zerowy w nazwie pliku, chociaż podejrzewam, że w większości systemów plików to po prostu skróci nazwę.)
Ilmari Karonen

Odpowiedzi:

33

Jeśli chcesz naprawić, a nie tylko próbujesz debugfs, możesz poprosić fsck o wykonanie pracy za Ciebie. Oznacz system plików jako brudny i uruchom, fsck -yaby zmienić nazwę pliku:

$ 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
źródło
3
e2fsckma -fopcję orce, która doprowadzi do pełnego sprawdzenia „nawet jeśli system plików wydaje się czysty”.
David Foerster,
3

Gratulujemy pracy fsck; jeśli z jakiegoś powodu nie działa odpowiedź jest ls -i1następnie umounti potem clri.

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

Właściwie przetestowałem tę metodę.

Jozuego
źródło
Jeśli jest to Linux (jak się wydaje), warto zauważyć, że clrinie jest to osobne polecenie (jak ma to miejsce w niektórych innych systemach uniksowych), to wewnątrz niego jest komenda debugfs.
hobbs
@ Hobbs: musi sprawić, że moje będą niezwykłe. Och, czekaj, nvm clri to tylko echo „clri $ 2” | debugfs „$ 1”
Joshua
Twoje instrukcje i tak wymagają uruchomienia fsck - co rozwiąże problem, z komunikatem Entry 'filen/ame' in / (2) has deleted/unused inode 12. Clear<y>?zamiast podanym w drugiej odpowiedzi - ale wykonanie clri jest dodatkowym krokiem. Wydaje się, że nie ma sposobu, aby rozwiązać ten problem wyłącznie z poziomu debugfs.
Random832
@ Random832: Miałem fsck, że nie naprawił go sam w przeszłości. :(
Joshua
-1

Jeśli przeniesiesz plik do katalogu, możesz następnie usunąć katalog z plikiem w nim zawartym.

mkdir foo 
mv filen* foo
rm -rf foo
carl
źródło
1
Działa to w przypadku każdej innej niezręcznej nazwy pliku, ale nie działa w przypadku nazwy pliku, która się /w nim znajduje.
zwolnić