Saya baru saja menjumpai pertanyaan berikut dalam Unix Programming Environment , buku klasik Kernighan dan Pike tentang Unix (saya menemukan teks di bawah ini di halaman 79 edisi 1984, ISBN: 0-13-937699-2):
Latihan 3-6. (Trick question) Bagaimana Anda mendapatkan / menjadi nama file (yaitu, a / yang tidak memisahkan komponen jalur?
Saya sudah bekerja dengan Linux selama bertahun-tahun, baik sebagai pengguna akhir dan pemrogram, tetapi saya tidak bisa menjawab pertanyaan ini. Tidak ada cara untuk memasukkan garis miring pada nama file, itu benar-benar dilarang oleh kernel. Anda dapat menambal sistem file Anda melalui blokir akses perangkat, atau menggunakan karakter yang mirip dari Unicode, tetapi itu bukan solusi.
Saya mengerti bahwa Linux ≠ Unix, tetapi prinsip yang sama harus berlaku, karena sistem harus dapat secara jelas mengekstraksi hierarki direktori dari path.
Adakah yang tahu, apa yang sebenarnya dipikirkan Kernighan dan Pike ketika mengajukan pertanyaan ini? Apa jawaban yang seharusnya? Apa sebenarnya 'trik' itu? Atau mungkin sistem Unix asli dibiarkan lolos dari tebasan ini entah bagaimana?
UPD:
Saya menghubungi Brian Kernighan tentang pertanyaan itu dan itulah yang dia jawab:
Jawabannya adalah (atau dulu) "Kamu tidak bisa."
Karenanya, Timothy Martin benar dan mendapatkan tanda centang hijau.
sumber
a
dan memaksa sistem Anda untuk berpikir sistem file berada di lokal EBCDIC? ASCIIa
adalah 0x61, yang sesuai dengan/
dalam EBCDIC (kode halaman 37)Jawaban:
Mungkin jawabannya sama dengan bagian dari jawaban dalam pertanyaan jebakan ini:
Bagaimana Anda turun dari gajah? Kamu tidak. Anda mendapatkannya dari angsa.
Dari "The Practice of Programming" oleh Brian W. Kernighan dan Rob Pike, Ch. 6, hal. 158:
sumber
Saya sudah melakukan ini. Ini pada sistem UNIX yang berjalan pada PDP-11 sekitar tahun 1980. Saya membuat file bernama "WhatXNow?". Saya kemudian menggunakan file biner "editor" untuk mengedit perangkat disk dan mengubah "X" menjadi "/" di inode (dengan sistem file di-unmount).
Korban tidak pernah menemukan cara untuk menghapusnya.
Sunting: whoops, Barmar benar, saya gagal melihat garis di sana tentang tidak menambal perangkat. Dan ya, itu adalah direktori yang saya edit, bukan inode. Sudah lama :-)
sumber
fsck
akan menghapusnya.Setiap skenario di mana
/
(lebih tepatnya, byte — bukan karakter — dengan nilai 0x2f; hampir semua kernel Unix sengaja tidak menyadari pengkodean karakter) menemukan jalannya ke entri direktori, tanpa blok disk mentah yang telah dimanipulasi dengan tangan, tidak perlu dipertanyakan lagi. bug di kernel.Bug semacam itu memang terjadi dari waktu ke waktu. Satu kasus yang saya ingat membaca catatan tempel untuk, adalah bahwa beberapa iterasi era 1990-an dari ... Saya ingin mengatakan Solaris, tetapi itu bisa salah ... menawarkan server untuk AppleTalk Filing Protocol (AFP), yang setara dengan NOS klasik MacOS untuk NFS . Masalahnya adalah, pada MacOS klasik Anda benar-benar diizinkan memasukkan
/
komponen pathname; pemisah direktori:
sebaliknya. Server AFP seharusnya melakukan persamaan moraltr :/ /:
ketika memetakan nama path yang dikirimkan oleh klien ke file pada disk-nya, tetapi mereka melewatkan beberapa jalur kode, dan karena server diimplementasikan di dalam kernel, ia sebenarnya bisa menulis entri direktori yang buruk.(Lihat FAQ comp.unix # 2.2 , subbagian yang dimulai "Bagaimana jika nama file memiliki '/' di dalamnya?", Untuk versi yang lebih lama dari yang di atas.)
sumber