Как удалить файл с именем «filen / ame» (с косой чертой) в файловой системе ext4 в debugfs?

26

Играя с e2fsprogs debugfs, случайно / случайно filen/ameбыл создан файл с именем . Очевидно, что символ прямой косой черты /служит специальным символом-разделителем в именах путей.

Все еще используя, debugfsя хотел удалить файл с именем filen/ame, но у меня был небольшой успех, так как /символ не интерпретируется как часть имени файла?

Предоставляет ли debugfs способ удалить этот файл, содержащий косую черту? Если так, то как?

Я использовал:

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

какие выводы:

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

Я попытался следующее, чтобы удалить filen/ameфайл:

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

но это не сработало и только произвело:

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

Помимо изменения содержимого узла каталога вручную, есть ли способ удалить файл, используя debugfs?

humanityANDpeace
источник
Выход из-за пересылки ( filen\/ame) не работает?
JAB
17
+1, и поздравляю. Вам удалось найти один из двух случаев «странного символа в имени файла», когда только правильное цитирование и / или экранирование символа в команде оболочки не решит проблему. (Другой будет нулевым байтом в имени файла, хотя я подозреваю, что на большинстве файловых систем это просто
Ilmari

Ответы:

33

Если вы хотите исправить, а не просто попробовать debugfs, вы можете сделать так, чтобы fsck сделал всю работу за вас. Пометьте файловую систему как грязную и запустите, fsck -yчтобы изменить имя файла:

$ 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
источник
3
e2fsckимеет -fопцию orce, которая приведет к полной проверке «даже если файловая система кажется чистой».
Дэвид Фёрстер
3

Поздравления по работе с fsck; если по какой-то причине это не сработало, за ответом ls -i1следует, umountа затем clri.

Ссылка: http://docstore.mik.ua/orelly/unix/upt/ch23_13.htm

Я на самом деле проверил этот метод.

Джошуа
источник
Если это Linux (что похоже), стоит отметить, что clriэто не отдельная команда (как в некоторых других системах Unix), это внутренняя подкоманда debugfs.
Хоббс
@hobbs: должен сделать мой необычным тогда. Ой, подождите, NVM Clri было просто эхо "Clri $ 2" | debugfs "$ 1"
Джошуа
В любом случае, ваши инструкции требуют запуска fsck - который решит проблему с сообщением Entry 'filen/ame' in / (2) has deleted/unused inode 12. Clear<y>?вместо того, которое указано в другом ответе - но выполнение clri - это дополнительный шаг. Кажется, не существует способа решить эту проблему исключительно из debugfs.
Random832
@ Random832: fsck я не исправлял сам по себе в прошлом. :(
Джошуа
-1

Если вы переместите файл в каталог, вы можете затем удалить каталог с файлом в нем.

mkdir foo 
mv filen* foo
rm -rf foo
деревенщина
источник
1
Это будет работать для любого другого неуклюжего имени файла, но не будет работать для имени файла, которое есть /в нем.
Звол