Bagaimana cara menghapus file bernama "filen / ame" (dengan slash) pada sistem file ext4 di debugfs?

26

Bermain dengan e2fsprogs debugfs, dengan perubahan / kecelakaan, file bernama filen/amedibuat. Jelas karakter garis miring maju /berfungsi sebagai karakter pemisah khusus dalam nama jalur.

Masih menggunakan debugfssaya ingin menghapus file bernama filen/ame, tapi saya sedikit berhasil, karena /karakter tidak ditafsirkan sebagai bagian dari nama file?

Apakah debugfs menyediakan cara untuk menghapus file ini yang berisi slash? Kalau begitu bagaimana?

Saya menggunakan:

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

yang keluaran:

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

Saya mencoba yang berikut ini untuk menghapus filen/amefile:

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

tetapi ini tidak berhasil dan hanya menghasilkan:

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

Selain mengubah konten node direktori secara manual, apakah ada cara untuk menghapus file menggunakan debugfs?

humanityANDpeace
sumber
Apakah melarikan diri forwardslash ( filen\/ame) tidak berfungsi?
JAB
17
+1, dan selamat. Anda telah berhasil menemukan satu dari hanya dua kasus "karakter aneh dalam nama file" di mana dengan tepat mengutip dan / atau melarikan diri karakter dalam perintah shell tidak akan menyelesaikan masalah. (Yang lain akan menjadi byte nol dalam nama file, meskipun saya menduga bahwa, pada sebagian besar filesystem, itu hanya akan memotong nama.)
Ilmari Karonen

Jawaban:

33

Jika Anda ingin memperbaiki dan tidak hanya mencoba debugfs, Anda dapat meminta fsck melakukan pekerjaan untuk Anda. Tandai sistem file sebagai kotor dan jalankan fsck -yuntuk mengubah nama file:

$ 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
sumber
3
e2fsckmemiliki -fopsi orce yang akan mengarah ke pemeriksaan penuh "bahkan jika sistem file tampak bersih".
David Foerster
3

Selamat atas kerja fsck; jika karena alasan tertentu tidak berhasil jawabannya ls -i1diikuti oleh umountdan kemudian clri.

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

Saya sebenarnya telah menguji metode ini.

Joshua
sumber
Jika ini adalah Linux (yang sepertinya), perlu dicatat bahwa clriini bukan perintah yang terpisah (seperti pada beberapa sistem Unix lainnya), ini adalah perintah di dalam debugfs.
hobbs
@obb: harus membuat milikku tidak biasa. Oh tunggu, nvm clri hanya gema "clri $ 2" | debugfs "$ 1"
Joshua
Instruksi Anda memerlukan menjalankan fsck - yang akan memperbaiki masalah, dengan pesan Entry 'filen/ame' in / (2) has deleted/unused inode 12. Clear<y>?alih-alih yang tertulis di jawaban lain - tetapi melakukan clri adalah langkah ekstra. Sepertinya tidak ada cara untuk menyelesaikan ini murni dari dalam debugfs.
Random832
@ Random832: Saya punya fsck tidak memperbaikinya sendiri di masa lalu. :(
Joshua
-1

Jika Anda memindahkan file ke direktori, Anda kemudian dapat menghapus direktori dengan file di dalamnya.

mkdir foo 
mv filen* foo
rm -rf foo
carl
sumber
1
Ini akan bekerja untuk nama file canggung lainnya , tetapi tidak akan bekerja untuk nama file yang ada /di dalamnya.
zwol