Wyzwanie Kernighana i Pike'a: jak wstawić slash w nazwie pliku?


23

Właśnie spotkałem następujące pytanie w Unix Programming Environment , klasycznej książce Kernighana i Pike'a na temat Uniksa (znalazłem poniższy tekst na s. 79 wydania z 1984 roku, ISBN: 0-13-937699-2):

Ćwiczenie 3-6. (Podchwytliwe pytanie) Jak uzyskać / w nazwie pliku (tzn., Że / nie rozdziela składników ścieżki?

Pracuję z Linuksem od lat, zarówno jako użytkownik końcowy, jak i programista, ale nie mogę odpowiedzieć na to pytanie. Nie ma sposobu na umieszczanie ukośników w nazwach plików, jest to absolutnie zabronione przez jądro. Możesz załatać system plików poprzez dostęp do urządzenia blokowego lub użyć podobnie wyglądających znaków z Unicode, ale to nie są rozwiązania.

Rozumiem, że Linux ≠ Unix, ale ta sama zasada powinna mieć zastosowanie, ponieważ system musi być w stanie jednoznacznie wyodrębnić hierarchię katalogów ze ścieżek.

Czy ktoś wie, o czym dokładnie myśleli Kernighan i Pike, zadając te pytania? Jaka była rzekoma odpowiedź? Czym dokładnie jest „sztuczka”? A może oryginalny system uniksowy może po prostu uciec przed tym cięciem?

UPD:

Skontaktowałem się z Brianem Kernighanem w sprawie pytania i on odpowiedział:

Odpowiedź brzmi (lub była) „Nie możesz”.

Dlatego Timothy Martin miał rację i dostał zielonego tik.


3
Powiązany (nie duplikowany), przypadek, w którym ktoś faktycznie nim zarządzał: Jak usunąć plik o nazwie „filen / ame” (z ukośnikiem) w systemie plików ext4 w debugfs?
— Michael Homer


Hmm Być może mógłbyś utworzyć plik zawierający małe litery ai zmusić swój system do myślenia, że ​​system plików znajduje się w ustawieniach regionalnych EBCDIC? ASCII ato 0x61, co odpowiada /w EBCDIC (strona kodowa 37)
— Fox

Czy sama książka mówi, że to podchwytliwe pytanie? Jeśli tak, to uważam, że w przybliżeniu potwierdza to, że nie będziesz w stanie znaleźć sposobu, aby to zrobić, pozostawiając gotowe pomysły, które już powiedziałeś.
— ilkkachu 19.04.17

Odpowiedzi:


12

Być może odpowiedź jest taka sama jak część odpowiedzi w tym podstępnym pytaniu:
Jak schodzisz ze słonia? Ty nie. Dostajesz go od gęsi.

Z „The Practice of Programming” Briana W. Kernighana i Roba Pike'a, Ch. 6, str. 158:

Kiedy Steve Bourne pisał swoją powłokę uniksową (która stała się znana jako powłoka Bourne'a), stworzył katalog 254 plików z jednoznakowymi nazwami, po jednym dla każdej wartości bajtu oprócz „\ 0” i ukośnika, dwóch znaków, które nie może pojawić się w nazwach plików Uniksa.


3
Dziękuję za nauczenie mnie tego żartu. Prawdopodobnie może służyć jako test biegłości w języku angielskim (którego właśnie nie zdałem).
— firegurafiku,

Miałeś rację. Zobacz UPD.
— firegurafiku,

1
@firegurafiku wyjaśnić żart .
— Izaak

5

Zrobiłem to. Było to w systemie UNIX działającym na PDP-11 około 1980 roku. Utworzyłem plik o nazwie „WhatXNow?”. Następnie użyłem „edytora” pliku binarnego do edycji urządzenia dyskowego i zmiany „X” na „/” w i-węzle (z odmontowanym systemem plików).

Ofiara nigdy nie wymyśliła, jak ją usunąć.

Edycja: ups, Barmar ma rację, nie widziałem tam linii o nie łataniu urządzenia. I tak, to był katalog, który edytowałem, a nie i-węzeł. Minęło trochę czasu :-)


1
Nazwy plików nie znajdują się w i-węźle, są w specjalnym pliku katalogu.
— Barmar 19.04.17

1
Podejrzewam fsck, że usunąłbym to.
— Barmar 19.04.17

1
Pytanie mówi, że możesz załatać swój system plików poprzez blokowanie dostępu do urządzenia lub użyć podobnie wyglądających znaków z Unicode, ale to nie są rozwiązania. Czy nie to opisujesz w swojej odpowiedzi?
— Barmar 19.04.17

@Barmar: Hmm, może zastanawiam się nad tym i łatanie systemu plików jest rozwiązaniem, które miało na celu? Nie wiem
— firegurafiku,

Założę się, że to była odpowiedź. Pamiętam, kiedy mogłeś czytać katalogi. Może przed wiekami root mógł je napisać.
— Joshua

1

Każdy scenariusz, w którym /(a dokładniej bajt - nie znak - o wartości 0x2f; prawie wszystkie jądra uniksowe są celowo nieświadome kodowania znaków) trafia do pozycji katalogu, bez ręcznego manipulowania surowymi blokami dysku, jest niewątpliwie błąd w jądrze.

Takie błędy zdarzają się od czasu do czasu. Jednym z przypadków, dla których pamiętam informacje o łatce, jest to, że niektóre iteracje z lat 90. XX wieku… Chcę powiedzieć, że Solaris, ale to może być błąd… oferował serwer dla protokołu AppleTalk Filing Protocol (AFP), który był klasycznym odpowiednikiem NFS dla MacOS . Kłopot polegał na tym, że w klasycznym MacOSie możesz idealnie umieścić /komponent pathname; :zamiast tego jest separator katalogów . Serwer AFP miał robić moralny ekwiwalent tr :/ /:przy mapowaniu ścieżek przesłanych przez klientów do plików na jego dysku, ale pominęli kilka ścieżek kodu, a ponieważ serwer został zaimplementowany w jądrze, mógł faktycznie wypisać złe wpisy katalogu.

(Patrz comp.unix FAQ # 2.2 , podsekcja rozpoczynająca się od „Co jeśli nazwa pliku zawiera„ / ”?), Dla dłuższej wersji powyższego.)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.