Tantangan Kernighan dan Pike: bagaimana cara memangkas nama file?

23

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.

firegurafiku
sumber
3
Terkait (bukan duplikat), kasus di mana seseorang benar-benar mengelolanya: Bagaimana cara menghapus file bernama "filen / ame" (dengan slash) pada sistem file ext4 di debugfs?
Michael Homer
Hmm. Mungkin Anda bisa membuat file yang mengandung huruf kecil adan memaksa sistem Anda untuk berpikir sistem file berada di lokal EBCDIC? ASCII aadalah 0x61, yang sesuai dengan /dalam EBCDIC (kode halaman 37)
Fox
Apakah buku itu sendiri mengatakan bahwa itu adalah pertanyaan jebakan? Jika demikian, saya pikir itu cukup banyak menegaskan Anda tidak akan dapat menemukan cara desain-by untuk melakukannya, meninggalkan ide out-of-the-box yang sudah Anda nyatakan.
ilkkachu

Jawaban:

12

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:

Ketika Steve Bourne sedang menulis shell Unix-nya (yang kemudian dikenal sebagai shell Bourne), ia membuat direktori 254 file dengan nama satu karakter, satu untuk setiap nilai byte kecuali '\ 0' dan slash, dua karakter yang tidak dapat muncul dalam nama file Unix.

Timothy Martin
sumber
3
Terima kasih telah mengajari saya lelucon itu. Mungkin, bisa berfungsi sebagai tes kelancaran berbahasa Inggris (yang saya baru saja gagal).
firegurafiku
Kamu benar. Lihat UPD.
firegurafiku
1
@firegurafiku menjelaskan Joke .
Isaac
5

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 :-)

Eliot Topher
sumber
1
Nama file tidak ada di inode, mereka ada di direktori file khusus.
Barmar
1
Saya curiga fsckakan menghapusnya.
Barmar
1
Pertanyaannya mengatakan Anda dapat menambal sistem file Anda melalui blokir akses perangkat, atau menggunakan karakter yang mirip dari Unicode, tetapi itu bukan solusi. Bukankah itu yang Anda jelaskan dalam jawaban Anda?
Barmar
@Barmar: Hmm, mungkin saya terlalu memikirkan pertanyaan dan menambal sistem file adalah solusi yang dimaksudkan? Saya tidak tahu
firegurafiku
Saya yakin ini adalah jawabannya. Saya ingat ketika Anda bisa membaca direktori. Mungkin berabad-abad yang lalu root bisa menulisnya.
Joshua
1

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 moral tr :/ /: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.)

zwol
sumber